SQL / Oracle: когда можно использовать индексы по нескольким столбцам - PullRequest
19 голосов
/ 12 сентября 2008

Если я создам индекс по столбцам (A, B, C), в таком порядке, насколько я понимаю, база данных сможет использовать его, даже если я буду искать только по (A) или (A и B) или (A и B и C), но не если я ищу только по (B), или (C), или (B и C). Это правильно?

Ответы [ 3 ]

13 голосов
/ 16 сентября 2008

На самом деле есть три метода доступа на основе индекса, которые Oracle может использовать, когда предикат помещается в не ведущий столбец индекса.

i) Пропуск сканирования индекса: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#PFGRF10105

ii) Быстрое полное сканирование индекса: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i52044

iii) Индекс полного сканирования: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i82107

Чаще всего я видел быстрое полное сканирование индекса «в дикой природе», но все возможно.

8 голосов
/ 12 сентября 2008

Это не правильно. Всегда лучше придумать контрольный пример, который представляет ваши данные, и убедитесь сами. Если вы хотите по-настоящему понять Oracle SQL Optimizer, Google Джонатан Льюис, почитайте его книги, прочитайте его блог, посетите его веб-сайт, этот парень потрясающий, и он всегда генерирует контрольные примеры.

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)
4 голосов
/ 15 сентября 2008

До версии Oracle 8 индекс никогда не будет использоваться, если только первый столбец не включен в SQL.

В Oracle 9i была введена функция Доступ к индексам с пропуском сканирования , которая позволяет Oracle CBO пытаться использовать индексы, даже если столбец префикса недоступен.

Хороший обзор того, как работает пропуск сканирования, здесь: http://www.quest -pipelines.com / newsletter-v5 / 1004_C.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...