DBAtlas · Атлас эксплуатации баз данных

Рекомендации по недостающим индексам из DMV (с оговорками)

SQL ServerОбслуживание

Команда

USE [Musteri];
SELECT TOP (25)
       mid.statement                                   AS table_name,
       mid.equality_columns, mid.inequality_columns, mid.included_columns,
       migs.user_seeks, migs.user_scans,
       CAST(migs.avg_total_user_cost AS DECIMAL(18,2)) AS avg_query_cost,
       migs.avg_user_impact                            AS est_impact_pct,
       CAST(migs.user_seeks * migs.avg_total_user_cost * migs.avg_user_impact / 100.0 AS DECIMAL(18,0)) AS score,
       migs.last_user_seek,
       N'CREATE INDEX [IX_' + OBJECT_NAME(mid.object_id, mid.database_id) + N'_missing_'
         + CAST(mid.index_handle AS NVARCHAR(10)) + N'] ON ' + mid.statement + N' ('
         + ISNULL(mid.equality_columns, N'')
         + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN N', ' ELSE N'' END
         + ISNULL(mid.inequality_columns, N'') + N')'
         + ISNULL(N' INCLUDE (' + mid.included_columns + N')', N'') AS create_stmt_draft
FROM   sys.dm_db_missing_index_details mid
  JOIN sys.dm_db_missing_index_groups mig       ON mig.index_handle = mid.index_handle
  JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
WHERE  mid.database_id = DB_ID()
ORDER BY score DESC;

-- 2019+: the query text behind each suggestion:
SELECT TOP (25) mid.statement AS table_name, misq.group_handle, misq.user_seeks,
       SUBSTRING(st.text, misq.last_statement_start_offset / 2 + 1, 300) AS statement_text
FROM   sys.dm_db_missing_index_group_stats_query misq
  JOIN sys.dm_db_missing_index_groups mig  ON mig.index_group_handle = misq.group_handle
  JOIN sys.dm_db_missing_index_details mid ON mid.index_handle = mig.index_handle
  CROSS APPLY sys.dm_exec_sql_text(misq.last_sql_handle) st
WHERE  mid.database_id = DB_ID()
ORDER BY misq.user_seeks DESC;

Что делает

Оценивает рекомендации по недостающим индексам, записанные оптимизатором при компиляции, по использованию, оценочной стоимости и эффекту и генерирует черновик CREATE INDEX; в 2019+ показывает также запрос, стоящий за каждой рекомендацией.

Когда использовать

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

Внимание

Не применяйте рекомендации вслепую: оптимизатор игнорирует существующие индексы, часто выдаёт почти дублирующиеся (перекрывающиеся) рекомендации и слишком широкие списки INCLUDE и упорядочивает столбцы по равенству/неравенству, а не по селективности. Каждый новый индекс стоит записи и места; сначала рассмотрите расширение существующего индекса. DMV сбрасываются при перезапуске, переводе базы в офлайн и изменении индексов таблицы. Запрос только на чтение; безопасно.

Открыть в DBAtlas →

Связанные материалы