Является ли глобально разделенный индекс лучше (быстрее), чем не разделенный индекс? - PullRequest
8 голосов
/ 31 августа 2009

Мне интересно узнать, есть ли выигрыш в производительности для разделения числового столбца, который часто является целью запроса. В настоящее время у меня есть материализованное представление, которое содержит ~ 50 миллионов записей. При использовании обычного индекса b-дерева и поиске по этому числовому столбцу, я получаю стоимость 7 и результат запроса примерно за 0,8 секунды (с незаполненным кешем). После добавления глобального раздела хеша (с 64 разделами) для этого столбца я получаю стоимость 6 и запрашиваю результаты примерно за 0,2 секунды (опять же с незаполненным кешем).

Моя первая реакция заключается в том, что секционированный индекс улучшил производительность моего запроса. Однако я понимаю, что это может быть просто совпадением и может полностью зависеть от значений, по которым выполняется поиск, или от других, о которых я не знаю. Итак, мой вопрос: есть ли выигрыш в производительности при добавлении глобального хеш-раздела в числовой столбец большой таблицы или стоимость определения того, какие разделы индекса сканировать, перевешивается по сравнению со стоимостью всего лишь полного сканирования неиндексированный раздел?

Я уверен, что на это, как и на многие вопросы Oracle, можно ответить "это зависит". :) Мне интересно узнать, какие факторы я должен учитывать, чтобы определить преимущества каждого подхода.

Спасибо!

1 Ответ

4 голосов
/ 02 сентября 2009

Я почти уверен, что вы нашли эту ссылку в своем исследовании - Секционированные таблицы и индексы . Однако я даю ссылку на него, если кому-то интересно, это очень хороший материал о разбиении.

Прямо в точку - Секционированный индекс просто разбивает индекс на части (16 в вашей ситуации) и распределяет данные в зависимости от их хешированного ключа секционирования. Когда вы захотите его использовать, Oracle «вычислит» хэш ключа и определит, в каком разделе продолжить поиск.

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

Наконец, вы должны быть более уверены в результатах теста. Если один метод дает лучшие результаты на ваших точных данных, чем какой-либо другой, не беспокойтесь о его реализации.

...