Bonjour,
j'ai la table suivante
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
CREATE TABLE T1(ID1 VARCHAR2(20),ID2 NUMBER,ID3 VARCHAR2(10),ID4 NUMBER,ID5 VARCHAR2(20),COL1 VARCHAR2(5)NOT NULL,COL2 VARCHAR2(5) ,COL3 VARCHAR2(5),COL4 VARCHAR2(5),COL5 VARCHAR2(5),PRIMARY KEY(ID1,ID2,ID3,ID4,ID5));
CREATE INDEX T1_idx ON T1(ID1, ID2, COL1); 
SELECT ID1,ID2,COL1,COUNT(*)FROM T1 GROUP BY ID1,ID2,COL1;
ID1 ID2 COL1 COUNT(*)
-------------- ------------ ------- --------
VALEUR1           20 D         70 
VALEUR1           23 D         70 
VALEUR1            6 D    1706000 
VALEUR1           14 D         70 
VALEUR1           15 D         70 
VALEUR1           16 D         70 
VALEUR1           18 D         70 
VALEUR1           26 D         70 
VALEUR1           17 D         70 
VALEUR1           25 D         70 
VALEUR1           13 D         70 
VALEUR1           24 D         70 
VALEUR1           28 D         70 
VALEUR1          100 D    1706500 
VALEUR1          1 D         71 
VALEUR1          1 true           5 
VALEUR1           10 D         70 
VALEUR1           21 D         70 
VALEUR1           29 D         70 
VALEUR1          101 D    1706500 
VALEUR1            5 D    1706000 
VALEUR1            9 D         70 
VALEUR1           11 D         35 
VALEUR1           19 D         70 
VALEUR1           22 D         70 
VALEUR1           27 D         70
et la requête suivante à optimiser (N un nombre quelconque)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SELECT*FROM(SELECT T1.ID1,T1.ID3,T1.ID4,Rank()over(ORDER BY T1.ID3,T1.ID4,T1.ID5)MON_ORDRE FROM T1 WHERE T1.ID1='VALEUR1'AND T1.ID2=1 AND T1.COL1='D')WHERE MON_ORDRE BETWEEN N AND N+10;
----------------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |   821K|    31M|       | 15195   (1)|202:48:58 |
|*  1 |  VIEW                 |              |   821K|    31M|       | 15195   (1)|202:48:58 |
|   2 |   COUNT               |              |       |       |       |            |          |
|   3 |    VIEW               |              |   821K|    21M|       | 15195   (1)|202:48:58 |
|   4 |     SORT ORDER BY     |              |   821K|    33M|    47M| 15195   (1)|202:48:58 |
|*  5 |      TABLE ACCESS FULL| T1           |   821K|    33M|       |  7194   (0)| 96:01:21 |
----------------------------------------------------------------------------------------------
Pourriez-vous me dire si il est possible d'optimiser cette instruction SELECT?
Pour information ,la requête suivante donne le même coût.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
SELECT * FROM (SELECT T1.ID1,T1.ID3,T1.ID4,Rank()over(ORDER BY T1.ID3,T1.ID4,T1.ID5)MON_ORDRE FROM T1 WHERE T1.ID1='VALEUR1' AND T1.ID2=1 AND T1.EST_VUE='D') WHERE MON_ORDRE BETWEEN N AND N+10;
 
-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |              |   821K|    31M|       | 15195   (1)|202:48:58 |
|*  1 |  VIEW                    |              |   821K|    31M|       | 15195   (1)|202:48:58 |
|*  2 |   WINDOW SORT PUSHED RANK|              |   821K|    33M|    47M| 15195   (1)|202:48:58 |
|*  3 |    TABLE ACCESS FULL     | T1           |   821K|    33M|       |  7194   (0)| 96:01:21 |
-------------------------------------------------------------------------------------------------