Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу ИСиТ.docx
Скачиваний:
6
Добавлен:
07.02.2024
Размер:
1.07 Mб
Скачать

Оптимизация индексов

Использование неключевых столбцов

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

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

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

  • Они не учитываются компонентом Database Engine при расчете числа ключевых столбцов индекса и размера ключа индекса.

Должен быть определен как минимум один ключевой столбец. Максимальное количество неключевых столбцов равно 1023. Это на 1 меньше, чем максимальное количество столбцов таблицы.

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

Кластеризованные и некластеризованные индексы могут содержать до 16 ключевых столбцов и размер ключа индекса (суммарная длина всех ключевых столбцов) не должен превышать 900 байт. Индексы на столбцах типа varchar, размер которых превышает 900 байт, могут быть созданы, если в момент создания индекса объем существующих данных в столбцах не превышает 900 байт; но последующие операции вставки или обновления, вызывающие превышение общего размера 900 байт, будут заканчиваться ошибкой.

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

Общий размер всех неключевых столбцов ограничен только размером столбцов, например столбцы varchar(max) могут иметь размер до 2 ГБ.

Следует избегать добавления неиспользуемых столбцов. Добавление слишком большого количества столбцов, может оказать следующее влияние на производительность:

  • На странице будет помещаться меньше строк индекса. Это может привести к увеличению количества операций ввода-вывода и снизить эффективность кэша.

  • Для хранения индекса потребуется больше места на диске. В частности, добавление типов данных varchar(max), nvarchar(max), varbinary(max) и xml в качестве неключевых индексных столбцов может значительно повысить требования к месту на диске. Это обусловлено тем, что значения столбцов копируются на конечный уровень индекса. Поэтому они находятся и в индексе, и в базовой таблице.

  • Обслуживание индекса может увеличить время выполнения операций изменения, вставки, обновления и удаления в базовой таблице или индексированном представлении.

Статистики и информация об отсутствующих индексах и

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

План выполнения запроса задает:

  • Последовательность, в которой происходит обращение к исходным таблицам.

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

  • Методы, используемые для извлечения данных из каждой таблицы.

Есть различные методы для обращения к данным в каждой таблице. Например, если необходимы только несколько строк с определенными ключевыми значениями, то Database Engine может использовать индекс. Если необходимы все строки в таблице, то может быть выполнен полный просмотр таблицы, игнорируя индексы. Если необходимы все строки в таблице, но есть индекс, ключевые столбцы которого находятся в ORDER BY, то выполнение просмотра индекса вместо просмотра таблицы позволит избежать отдельный сортировки результирующего набора.

Оптимизатор запросов SQL Server основан на оценке стоимости. Каждому возможному плану выполнения соответствует некоторая стоимость, определенная в терминах объема использованных вычислительных ресурсов. Оптимизатор запросов SQL Server выбирает план выполнения, основываясь не только на самой низкой стоимости ресурсов - он выбирает такой план, который возвращает результаты пользователю за минимальное время при разумной стоимости ресурсов. Например, параллельная обработка запроса обычно использует больше ресурсов, чем его последовательная обработка, но завершает выполнение запроса быстрее. Оптимизатор SQL Server будет использовать параллельный план выполнения для возврата результатов, если это не окажет негативного влияния на загрузку сервера.

Для оценки количества строк в результатах запроса и как следствие нагрузки на вычислительные ресурсы оптимизатор запросов полагается на статистику распределения. Статистика - это объект, содержащие статистические сведения о распределении значений в одном или нескольких столбцах таблицы. Например, оптимизатор запросов может использовать оценочное количество элементов, чтобы выбрать метод для обращения к данным в таблице.

Каждый объект статистики создается для списка из одного или нескольких столбцов таблицы и содержит гистограмму, в которой отображается распределение значений в первом столбце. Объекты статистики для нескольких столбцов также хранят статистические сведения о корреляции значений между столбцами. Эти статистические данные корреляции называются значениями плотности и получаются из числа уникальных строк значений столбцов.

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

Использование статистики на уровне базы данных контролируется следующими параметрами, рассмотренными в модуле 2:

  • AUTO_CREATE_STATISTICS

Оптимизатор запросов в случае необходимости создает статистику по отдельным столбцам в предикатах запросов, чтобы улучшить планы запросов и повысить производительность запросов.

  • AUTO_UPDATE_STATISTICS

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

  • AUTO_UPDATE_STATISTICS_ASYNC

Указывает, что запросы, которые запускают автоматическое обновление устаревшей статистики, не будут ожидать обновления статистики перед компиляцией. Последующие запросы будут использовать обновленную статистику, когда она будет доступна.

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

Соседние файлы в предмете Информатика