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.
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
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
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
Partager