Bonjour,
j'ai la table suivante
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
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
Pourriez-vous me dire si il est possible d'optimiser cette instruction SELECT?
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 | ----------------------------------------------------------------------------------------------
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 | -------------------------------------------------------------------------------------------------
Partager