При формировании плана запроса оптимизатор запросов анализирует, какие индексы наилучшим образом подойдут для конкретного условия фильтра. Если наиболее подходящие индексы не существуют, оптимизатор запросов формирует близкий к оптимальному план запроса, однако по-прежнему сохраняет сведения об этих индексах. Функция отсутствующих индексов позволяет получить сведения об этих индексах, что дает возможность решить, стоит ли их реализовывать или нет.
Компоненты функции отсутствующих индексов подробно описываются в следующих подразделах.
При выполнении типичной рабочей нагрузки на сервере SQL Server можно получить сведения об отсутствующих индексах, обратившись с запросом к объектам DMO, перечисленным в следующей таблице. Эти объекты DMO хранятся в базе данных master.
|
Объект DMO
|
Возвращаемые сведения
|
|---|
|
sys.dm_db_missing_index_group_stats
|
Возвращает сводные сведения о группах отсутствующих индексов, например сведения о возможном увеличении производительности, которое может быть достигнуто за счет реализации конкретных групп отсутствующих индексов.
|
|
sys.dm_db_missing_index_groups
|
Возвращает сведения о конкретной группе отсутствующих индексов, например идентификатор группы и идентификаторы всех отсутствующих индексов, содержащихся в этой группе.
|
|
sys.dm_db_missing_index_details
|
Возвращает подробные сведения об отсутствующем индексе, например имя и идентификатор таблицы, в которой отсутствует индекс, а также имена и типы столбцов, на основе которых должен быть сформирован отсутствующий индекс.
|
|
sys.dm_db_missing_index_columns
|
Возвращает информацию о столбцах таблицы в базе данных, которых не хватает в индексе.
|
Информацию, возвращаемую этими объектами DMO, можно использовать в программных средствах и сценариях, в которых на основе этих сведений формируются DDL-инструкции CREATE INDEX, реализующие названные отсутствующие индексы.
Согласованность транзакций
Частные изменения отдельных строк данных объектов DMO не являются транзакционно согласованными. Это значит, что при отмене запроса или откате транзакции, включающей в себя этот запрос, строки, содержащие сведения об отсутствующих индексах для данного запроса, продолжат свое существование.
Поддерживаются только транзакции целиком. Контрольные точки и частичный откат не поддерживаются.
Примечание. |
|---|
|
При изменении метаданных таблицы из этих объектов DMO удаляются все сведения об отсутствующих индексах для данной таблицы. Изменения метаданных таблицы могут возникать, например при добавлении или удалении столбцов из таблицы или при создании индекса по столбцу таблицы.
|
Для соотнесения запросов, имеющих отсутствующие индексы, перечисленные в результатах объектов DMO, можно просмотреть элемент MissingIndexes класса событий XML Showplans. Элемент MissingIndexes проиллюстрирован в следующем примере.
<ShowPlanXML…>
<BatchSequence>
<Batch>
<Statements>
<StmtSimple…>
<StatementSetOptions… />
<QueryPlan…>
<MissingIndexes>
<MissingIndexGroup Impact="22.8764">
<MissingIndex Database="[ADVENTUREWORKS]" Schema="[Person]" Table="[Address]">
<ColumnGroup Usage="EQUALITY">
<Column Name="[PostalCode]" ColumnId="4" />
</ColumnGroup>
<ColumnGroup Usage="INEQUALITY">
<Column Name="[ModifiedDate]" ColumnId="5" />
</ColumnGroup>
<ColumnGroup Usage="INCLUDE">
<Column Name="[AddressLine1]" ColumnId="2" />
<Column Name="[AddressLine2]" ColumnId="3" />
<Column Name="[StateProvinceID]" ColumnId="1" />
</ColumnGroup>
</MissingIndex>
</MissingIndexGroup>
</MissingIndexes>
Благодаря сведениям, содержащимся в элементе MissingIndexes, можно определить, какие именно индексы помогут поднять производительность выполнения конкретного запроса, описанного в элементе StmtSimple, который сам включает в себя инструкцию языка Transact-SQL. Затем с помощью сведений, возвращенных для данного элемента, можно написать собственную DDL-инструкцию CREATE INDEX.