О функции отсутствующих индексов

Функция отсутствующих индексов использует объекты DMO и классы событий Showplan для получения сведений об отсутствующих индексах, благодаря которым можно повысить производительность обработки запросов в SQL Server.

Компоненты

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

Функция отсутствующих индексов состоит из следующих компонентов.

  • Набор объектов DMO, к которым можно обращаться с запросами для извлечения сведений об отсутствующих индексах.

  • Элемент XML Showplan MissingIndexes, связывающий индексы, рассматриваемые оптимизатором запросов как отсутствующие, с запросами, для которых они являются отсутствующими.

Компоненты функции отсутствующих индексов подробно описываются в следующих подразделах.

Объекты DMO

При выполнении типичной рабочей нагрузки на сервере 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 (Transact-SQL)

Возвращает информацию о столбцах таблицы в базе данных, которых не хватает в индексе.

Информацию, возвращаемую этими объектами DMO, можно использовать в программных средствах и скриптах, в которых на основе этих сведений формируются DDL-инструкции CREATE INDEX, реализующие названные отсутствующие индексы.

Согласованность транзакций

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

Поддерживаются только транзакции целиком. Контрольные точки и частичный откат не поддерживаются.

ПримечаниеПримечание

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

элемент MissingIndexes класса событий XML Showplan

Для обнаружения запросов, имеющих отсутствующие индексы, перечисленные в результатах объектов DMO, можно просмотреть элемент MissingIndexes класса событий XML Showplans. Элемент MissingIndexes проиллюстрирован в следующем примере.

<ShowPlanXML…>

 <BatchSequence>

  <Batch>

   <Statements>

    <StmtSimple…>

     <StatementSetOptions… />

      <QueryPlan…>

        <MissingIndexes>

        <MissingIndexGroup Impact="22.8764">

         <MissingIndex Database="[ADVENTUREWORKS2008R2]" 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.

Включение и выключение функции отсутствующих индексов

Функция отсутствующих индексов по умолчанию включена. Отсутствуют управляющие элементы, позволяющие включать или выключать ее, а также сбрасывать таблицы, возвращаемые при обращении с запросом к объектам DMO. При перезапуске SQL Server удаляются все сведения об отсутствующих индексах.

Данную функцию можно отключить только в том случае, если экземпляр SQL Server запускается с аргументом -x с помощью программы командной строки sqlservr. Дополнительные сведения см. в разделе Приложение sqlservr.