SQL/Oracle :quand des index sur plusieurs colonnes peuvent être utilisés

StackOverflow https://stackoverflow.com/questions/57878

  •  09-06-2019
  •  | 
  •  

Question

Si je crée un index sur les colonnes (A, B, C), dans cet ordre, je crois comprendre que la base de données pourra l'utiliser même si je recherche uniquement sur (A), ou (A et B), ou ( A et B et C), mais pas si je recherche uniquement sur (B), ou (C), ou (B et C).Est-ce correct?

Était-ce utile?

La solution

Il existe en fait trois méthodes d'accès basées sur l'index qu'Oracle peut utiliser lorsqu'un prédicat est placé sur une colonne non principale d'un index.

i) Saut d'analyse d'index : http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#PFGRF10105

ii) Analyse rapide de l'index complet : http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i52044

iii) Analyse complète de l'index : http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i82107

J'ai le plus souvent vu l'analyse rapide de l'index complet "dans la nature", mais toutes sont possibles.

Autres conseils

Ce n'est pas correct.Il est toujours préférable de proposer un cas de test qui représente vos données et de voir par vous-même.Si vous voulez vraiment comprendre Oracle SQL Optimizer sur Google Jonathan Lewis, lire ses livres, lire son blog, consulter son site Web, le gars est incroyable et il génère toujours des cas de test.

create table mytab nologging as (
select mod(rownum, 3) x, rownum  y, mod(rownum, 3) z from all_objects, (select 'x' from user_tables where rownum < 4)
);

create index i on mytab (x, y, z);

exec dbms_stats.gather_table_stats(ownname=>'DBADMIN',tabname=>'MYTAB', cascade=>true);

set autot trace exp

select * from mytab where y=5000;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=10)
   1    0   INDEX (SKIP SCAN) OF 'I' (INDEX) (Cost=1 Card=1 Bytes=10)

Jusqu'à la version Oracle 8 un index ne sera jamais utilisé à moins que la première colonne ne soit incluse dans le SQL.

Dans Oracle 9i, le Ignorer l'accès à l'index d'analyse Une fonctionnalité a été introduite, qui permet à Oracle CBO de tenter d'utiliser des index même lorsque la colonne de préfixe n'est pas disponible.

Bon aperçu du fonctionnement du skip scan ici : http://www.quest-pipelines.com/newsletter-v5/1004_C.htm

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top