Bonjour,

Je me trouve confronté au problème suivant : en ajoutant un ORDER BY dans ma requête SQL, le nombre de CONSISTENT GETS diminue fois 10 et je ne peux pas l'expliquer...
Quelqu'un aurait-il une idée?

Je crée une table avec 600 000 rows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> create table test_obj01 as select OWNER, OBJECT_NAME, SUBOBJECT_NAME from dba_objects;
 
SQL> insert into test_obj01 select * from test_obj01;
78417 rows created.
 
SQL> /
...
...
 
SQL> select count(*) from test_obj01;
COUNT(*)
----------
627352
Création d'un ID avec rownum et je génère les stats.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SQL> update test_obj01 set OWNER = OWNER || to_char(rownum);
627352 rows updated.
SQL> commit;
 
SQL> exec dbms_stats.gather_schema_stats('HR');

Si je fais un SELECT sans ORDER BY, voilà ce que j'obtiens la deuxième fois (je ne mets pas le premier SELECT car il y a des lectures sur disque dur).
Ce sont les mêmes nombres si je ré-exécute plusieurs fois la requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SQL> set autotrace traceonly explain statistics
SQL> SET TIMING ON

SQL> select owner from test_obj01;
627352 rows selected.
Elapsed: 00:00:04.13

Execution Plan
----------------------------------------------------------
Plan hash value: 2410895595

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation	                         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	                   |   627K|  7351K|  1168	 (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL  |  TEST_OBJ01   |   627K|  7351K|  1168	 (1)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
	  0  recursive calls
	  0  db block gets
      45841  consistent gets
	  0  physical reads
	  0  redo size
   15681662  bytes sent via SQL*Net to client
     460660  bytes received via SQL*Net from client
      41825  SQL*Net roundtrips to/from client
	  0  sorts (memory)
	  0  sorts (disk)
     627352  rows processed

Je fais un A/R de ma base (oui, c'est violent), j'ajoute le ORDER BY et, pour les SELECT après le premier, voilà les résultats : temps de requête identique que sans le ORDER BY mais le nombre de CONSISTENT GETS à diminué de 10...
Et on voit bien que le ORDER BY est exécuté.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SQL> select owner from test_obj01 order by owner;
627352 rows selected.

Elapsed: 00:00:04.10

Execution Plan
----------------------------------------------------------
Plan hash value: 2720153981
--------------------------------------------------------------------------------

| Id  | Operation	   	                            | Name		      | Rows | Bytes     |TempSpc| Cost (%CPU)| Time	|
---------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |			      |   627K|  7351K|		       |  4029   (1)| 00:00:01 |
|   1 |  SORT ORDER BY	            |			      |   627K|  7351K|    12M      |  4029   (1)| 00:00:01 |
|   2 |   TABLE ACCESS FULL                   | TEST_OBJ01     |   627K|  7351K|		       |  1168   (1)| 00:00:01 |

-----------------------------------------------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
	  0  recursive calls
	  0  db block gets
       4283  consistent gets
	  0  physical reads
	  0  redo size
   15681662  bytes sent via SQL*Net to client
     460660  bytes received via SQL*Net from client
      41825  SQL*Net roundtrips to/from client
	  1  sorts (memory)
	  0  sorts (disk)
     627352  rows processed