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

  • Существует ли другой индекс, идентичный тому, который предполагается создать? Если это так, то почему он не выбран оптимизатором запросов (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)

--=============================================