Селективность выражения с индексированным столбцом

Оценить
(0 голоса)

Как вы уже знаете, оптимизатор использует индексы для повышения скорости выполнения запроса. Когда вы обращаетесь к таблице, у которой нет индексов, или если оптимизатор принимает решение не использовать существующий индекс, система выполняет последовательное сканирование таблицы. В процессе сканирования таблицы Database Engine последовательно читает страницы данных таблицы для поиска строк, которые принадлежат результирующему набору данных. Доступ по индексу является методом доступа, при котором система базы данных читает и записывает страницы данных с использованием индекса. Так как доступ по индексу значительно сокращает количество операций ввода/вывода, он обычно выполняется гораздо быстрее, чем сканирование таблицы.

Как вы уже знаете, Database Engine использует некластеризованный индекс для поиска данных одним из двух способов. Если у вас есть куча (таблица без кластеризованного индекса), то система вначале исследует структуру некластеризованного индекса, а затем отыскивает строку, используя идентификатор этой строки. Однако если у вас кластеризованная таблица, то проход по некластеризованной индексной структуре выполняется вслед за проходом по индексной структуре кластеризованного индекса таблицы. С другой стороны, использование кластеризованного индекса для поиска данных всегда уникально: Database Engine начинает поиск с корневого узла соответствующего В-дерева и обычно после трех или четырех операций чтения достигает узла листа, где хранятся данные. По этой причине проход по индексной структуре кластеризованного индекса почти всегда выполняется значительно быстрее, чем проход по индексной структуре соответствующего некластеризованного индекса.

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

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

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

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


Статистические данные индекса
Статистические данные столбца
Выбор порядка соединения
Техники обработки соединения
Вложенные циклы

Добавить комментарий


Защитный код
Обновить

© 2018 www.serversql.ru. Все права защищены.