Выясняя возможности настройки проблемных запросов, важно иметь полную картину других индексов, уже существующих для таблицы. Это поможет ответить на несколько вопросов перед добавлением еще одного индекса:
- Существует ли другой индекс, идентичный тому, который предполагается создать? Если это так, то почему он не выбран оптимизатором запросов (QO)?
- Существует ли аналогичный индекс для таблицы? Если да, то вероятно его можно настроить, сделав полезным для запроса. Обязательно нужно взглянуть на использование индекса, чтобы определить, применяется ли он в других исполнениях плана запроса.
- Не слишком ли много индексов для данной таблицы?
- Является ли эта таблица кучей (к ней не применяются кластеризованные индексы)?
Ответы на все эти вопросы можно получить, направив запросы к трем представлениям системного каталога (см. листинг):
- sys.indexes предоставляет метаданные, относящиеся ко всем индексам в базе данных;
- sys.all_columns предоставляет информацию обо всех столбцах во всех таблицах и представлениях в базе данных;
- sys. index_columns служит посредником, сопоставляя столбцы с индексами на основе их index_id, object_id и column_id.
Обратите внимание, что для имени таблицы применяется параметр шаблона. Просто используйте сочетание клавиш Cntl+Shift+M, чтобы заменить это значение подходящим именем таблицы.
Результаты запроса предоставляют следующую информацию, на основе которой можно сделать обоснованные выводы для дальнейших действий:
- определение такой информации, как имя индекса и имя столбца;
- информация о структуре индекса (кластеризованный или некластеризованный индекс);
- информация о столбце (упорядочение, уникальность, является ли столбец включенным);
- ссылочная информация (используется ли индекс в ограничении первичного ключа или уникальном ограничении).
Любые сведения важны для принятия решений о настройке производительности, если изменения в индексации — один из возможных вариантов для «таблицы».
Листинг. Запрос к трем представлениям системного каталога
--=============================================
--Какие индексы существуют в этой таблице?
--=============================================
SELECT OBJECT_NAME(I.[object_id]) AS [object_name] , I.name AS index_name , IC.index_column_id , AC.name AS column_name , IC.[is_descending_key] , IC.is_included_column , I.type_desc AS index_type , I.is_primary_key , I.is_unique , I.is_unique_constraint FROM sys.indexes I INNER JOIN sys.index_columns IC ON I.index_id = IC.index_id AND I.[object_id] = IC.[object_id] INNER JOIN sys.all_columns AC ON IC.[object_id] = AC.[object_id] AND IC.column_id = AC.column_id WHERE I.object_id = OBJECT_ID('') ORDER BY I.is_primary_key DESC , I.name , IC.is_included_column , IC.index_column_id;
--============================================
— By Tim Ford, SQL Cruise (www.sqlcruise.com)
--=============================================