Autre question:
pourquoi cette requête ne prend-elle pas l'index sur la colonne suid:
??
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from syslogins where ( suid=10 or 1=0 )
Autre question:
pourquoi cette requête ne prend-elle pas l'index sur la colonne suid:
??
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from syslogins where ( suid=10 or 1=0 )
Je suis surpris. Sur quelle version ? Peux-tu nous afficher les 2 plans d'exécution ? Moi, j'ai, pour un ASE 15.0.2, le même choix d'index
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
33 1> set showplan on 2> go 1> select * from syslogins where suid=2 2> go Message empty. PLAN D' EXECUTION DE REQUETE POUR INSTRUCTION 1 (ligne 1). Message empty. Message empty. ETAPE 1 Le type de requête est SELECT. Message empty. 1 operator(s) under root Message empty. |ROOT:EMIT Operator | | |SCAN Operator | | FROM TABLE | | syslogins | | Utilisation d'index clusterisé. | | Index : csyslogins | | Balayage avant. | | Positionnement par clé. | | Les clés sont : | | suid CRO | | Utilisation de la taille d'E/S de 2 Ko pour les pages d'index de niveau feuille. | | Avec stratégie de remplacement de buffer LRU pour les pages d'index de niveau feuille. | | Utilisation de la taille d'E/S de 2 Ko pour les pages de données. | | Avec stratégie de remplacement de buffer LRU pour les pages de données. Message empty. Message empty.
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 1> select * from syslogins where (suid=2 or 1=0) 2> go Message empty. PLAN D' EXECUTION DE REQUETE POUR INSTRUCTION 1 (ligne 1). Message empty. Message empty. ETAPE 1 Le type de requête est SELECT. Message empty. 2 operator(s) under root Message empty. |ROOT:EMIT Operator | | |RESTRICT Operator | | | | |SCAN Operator | | | FROM TABLE | | | syslogins | | | Utilisation d'index clusterisé. | | | Index : csyslogins | | | Balayage avant. | | | Positionnement en début d'index. | | | Utilisation de la taille d'E/S de 2 Ko pour les pages d'index de niveau feuille. | | | Avec stratégie de remplacement de buffer LRU pour les pages d'index de niveau feuille. | | | Utilisation de la taille d'E/S de 2 Ko pour les pages de données. | | | Avec stratégie de remplacement de buffer LRU pour les pages de données. Message empty. Message empty.
Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2
N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD
Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
Je suis aussi en 15.0.2.
Tu remarqueras que dans le plan d'exécution de ta deuxième requête, il se positionne au début de l'index, ce qui est inefficace.# SELECT * FROM syslogins WHERE ( suid=2 );
QUERY PLAN FOR STATEMENT 1 (at line 1).
STEP 1
The type of query is SELECT.
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
| |SCAN Operator (VA = 0)
| | FROM TABLE
| | syslogins
| | Using Clustered Index.
| | Index : csyslogins
| | Forward Scan.
| | Positioning by key.
| | Keys are:
| | suid ASC
| | Using I/O Size 2 Kbytes for index leaf pages.
| | With LRU Buffer Replacement Strategy for index leaf pages.
| | Using I/O Size 2 Kbytes for data pages.
| | With LRU Buffer Replacement Strategy for data pages.
Parse and Compile Time 0.
Adaptive Server cpu time: 0 ms.
Execution Time 0.
Adaptive Server cpu time: 0 ms. Adaptive Server elapsed time: 0 ms.
# SELECT * FROM syslogins WHERE ( suid=2 OR 1=0 );
QUERY PLAN FOR STATEMENT 1 (at line 1).
STEP 1
The type of query is SELECT.
2 operator(s) under root
|ROOT:EMIT Operator (VA = 2)
|
| |RESTRICT Operator (VA = 1)(0)(0)(0)(7)(0)
| |
| | |SCAN Operator (VA = 0)
| | | FROM TABLE
| | | syslogins
| | | Table Scan.
| | | Forward Scan.
| | | Positioning at start of table.
| | | Using I/O Size 16 Kbytes for data pages.
| | | With LRU Buffer Replacement Strategy for data pages.
Parse and Compile Time 0.
Adaptive Server cpu time: 0 ms.
Execution Time 0.
Adaptive Server cpu time: 0 ms. Adaptive Server elapsed time: 0 ms.
Je pense que dans mon cas la syslogins est petite, donc il choisi de la scanner.
Quand je prend une plus grosse table, l'index est pris, mais de manière inefficace (nonmatching index scan). Le problème est que l'optimiseur n'enlève pas le 'dead code' 1=0.
Oups, j'ai répondu un peu vite en lisant un peu rapidement mes plans.
Ma syslogins est des plus petites (3 lignes).
J'ai d'abord été surpris de voir qu'il envisageait l'index car normalement, pour moins de 200 pages, il ne devrait même pas le faire...
Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2
N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD
Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
Partager