2016-06-28 7 views
2

Я много раз искал это, но я не получил точного объяснения тому же.Индексы на составной первичный ключ

Я работаю над сложными структурами баз данных (в Oracle 10g), где у меня почти нет первичного ключа в одном столбце, кроме статических таблиц.

Теперь мой вопрос - это составной идентификатор первичного ключа (LXI, VCODE, IVID, GHID). Поскольку это первичный ключ, Oracle будет предоставлять индекс по умолчанию.

Будет ли я получать ОДИН (сгенерированный системой) единственный индекс для самого первичного ключа или для его под-столбцов?

Запрашиваю это, потому что я получаю данные (около миллионов записей) на основе отдельных столбцов. Теперь, если система генерирует индексы для отдельных столбцов. Почему мой запрос работает довольно быстро, чем то, как он работает, когда я явно определяю индексы для каждого отдельного столбца.

Пожалуйста, дайте удовлетворительный ответ

Заранее спасибо

+0

Я думаю, что ответ на этот вопрос не трудно проверить для себя, нет? Просто проверьте, какие индексы созданы ... – sstan

+0

Это хороший вопрос. Было бы еще лучше, если бы он показывал данные о производительности для запроса с использованием двух разных структур индексов. –

ответ

3

Первичный ключ не является NULL уникальный ключ. В вашем случае уникальный индекс имеет четыре столбца, LXI, VCODE, IVID GHID в порядке декларации.

Если у вас есть условие на VCODE, но не на LXI, тогда большинство баз данных не будут использовать индекс. Oracle имеет специальный тип сканирования индексов, называемый «skip scan», который позволяет эту ситуацию. Он описан в documentation.

Я бы ожидал, что сканирование индекса будет немного медленнее, чем сканирование диапазона индексов на отдельных столбцах. Однако, что лучше, также может зависеть от сложности предложения where. Например, три условия равенства на VCODE, IVID и GHID, соединенные AND, могут служить отличным примером для сканирования пропусков. И такой индекс будет охватывать статью WHERE - большую эффективность - и лучше, чем индексы с одним столбцом.

Как примечание: индекс сканирования скипа были введены в Oracle 9i, поэтому они доступны в Oracle 10.

+0

Отличный ..! Спасибо за объяснение и документацию. :) –

0

Это не будет создавать индекс для отдельного столбца. он сгенерирует составной индекс , сначала он будет индексироваться на LXI , затем следующий столбец, как будто это будет древовидная структура. , если поиск по 1-й столбец первичного ключа он будет использовать индекс, чтобы использовать индекс для второго вы должны объединить его с первым столбцом

ex : select where ...LXI=? will use index PK 
    select where LXI=? and VCODE=? alse use pk 
    but select where VCODE=? will not use it (without LXI) 
+1

В основном, правда, но Oracle способна выполнять сканирование индексов также для вашего последнего варианта использования. – sstan

+0

@sstan согласился, но. «Сканирование прокрутки индекса использует логические субиндексы составного индекса. База данных« пропускает »через один индекс, как если бы он искал отдельные индексы. Пропустить сканирование полезно, если в главном столбце составного индекса имеется несколько разных значений, а многие отличные значения в неэлементном ключе индекса ». –

+0

@sstan, если LXI имеет большой набор различных значений. –