Index Skip Scan ou INDEX_SS, pour ceux qui préfèrent les HINTS, est un algorithme qui permet d’utiliser un index même si la ou les premières colonnes de cet index ne sont pas dans la clause WHERE de votre requête. Vous me direz qu’à la veille de la sortie de 11g, je pourrais parler d’autre chose que des nouveautés de 9i… Il n’empêche que j’ai eu une intéressante conversation à ce propos aujourd’hui et le CBO n’utilisera cet algorithme que si c’est intéressant (selon ses statistiques, entendons nous !). C’est à dire si la cardinalités des première colonnes n’est pas trop élevé. Eh ! Oubliez la dernière phrase que je viens d’écrire ! vous ne pouvez pas décrire avec des règles le comportement du CBO puisque sinon, il s’appèlerait encore RBO !
Le mieux c’est de vous montrer un exemple (Utilisez 9i, 10g ou plus mais pas moins!)
Etape 1 : Créer une table et l’alimenter
create table gark(a number,
b number);
begin
for i in 1..50000 loop
insert into t1 values
(mod(i,10),i);
end loop;
commit;
end;
/
create index gark_idx on gark(a,b);
exec dbms_stats.gather_table_stats(user ,-
'GARK', cascade=>true, -
method_opt=>'FOR ALL COLUMNS SIZE 254');
Etape 2 : Constater que l’index peut être utilisé
set autotrace traceonly explain
select * from gark
where b=56 -- b est la seconde colonne de l'index
;
Execution Plan
----------------------------------------------------------
Plan hash value: 4099952983
------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 1 |
|* 1 | INDEX SKIP SCAN | GARK_IDX | 1 | 26 | 1 |
------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("B"=56)
filter("B"=56)
Etape 3 : Nettoyer
drop table gark;
En même temps, j’en suis réduit à publier des choses à propos de 9i et 10 g puisque la 11g n’est toujours pas là et comme de toute façon tout le monde est en vacances (sauf moi), on s’en fout !
1 réflexion sur “Un exemple d'utilisation de INDEX SKIP SCAN”
Très belle demonstration!
Juste une remarque au chargement de la table gark :
for i in 1..50000 loop insert into t1 values (mod(i,10),i);
c’est plutôt gark au lieu de t1 🙂
Meri pour cet effort.
Cdt,
Orafaoui
Les commentaires sont fermés.