sys.dm_db_missing_index_details (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

傳回遺漏索引的詳細資訊。

在 Azure SQL Database 中,動態管理檢視不可以公開可能會影響資料庫內含項目的資訊,或公開有關使用者可存取之其他資料庫的資訊。 為了避免公開此資訊,系統會篩選出包含不屬於連線租用戶之資料的每個資料列。

資料行名稱 資料類型 描述
index_handle int 識別特定的遺漏索引。 識別碼在伺服器中是唯一的。 index_handle 是這個資料表的索引鍵。
database_id smallint 識別具有遺漏索引之資料表所在的資料庫。

在 Azure SQL 資料庫中,這些值在單一資料庫或彈性集區內是唯一的,但在邏輯伺服器內則不是唯一的。
object_id int 識別遺漏索引的資料表。
equality_columns nvarchar(4000) 造成表單相等述詞的資料行逗號分隔清單:

table.column = constant_value
inequality_columns nvarchar(4000) 造成不等比較述詞的資料行逗號分隔清單,例如,表單的述詞:

table.column > constant_value

「=」 以外的任何比較運算子都表示不相等。
included_columns nvarchar(4000) 以逗號分隔的資料行清單,以涵蓋查詢的資料行。 如需涵蓋或包含資料行的詳細資訊,請參閱 使用內含 資料行建立索引。

針對記憶體優化索引(雜湊和記憶體優化非叢集),請忽略 included_columns 。 資料表的所有資料行都包含在每個記憶體優化索引中。
陳述式 nvarchar(4000) 遺漏索引的資料表名稱。

備註

當查詢最佳化工具優化且不會保存時,所傳 sys.dm_db_missing_index_details 回的資訊會更新。 只有在資料庫引擎重新開機之前,才會保留遺漏的索引資訊。 如果資料庫管理員想要在伺服器回收之後保留,資料庫管理員應該定期製作遺漏索引資訊的備份複本。 使用 sys.dm_os_sys_info 中的 sqlserver_start_time 資料行,來尋找最近一次資料庫引擎啟動時間。

若要判斷特定遺漏索引的哪個遺漏索引群組是其中的一部分,您可以根據 index_handle 資料行來查詢 sys.dm_db_missing_index_groups 動態管理檢視 sys.dm_db_missing_index_details

注意

此 DMV 的結果集限制為 600 個數據列。 每個資料列都包含一個遺漏的索引。 如果您有超過 600 個遺漏的索引,您應該解決現有的遺漏索引,以便您接著檢視較新的索引。

在 CREATE INDEX 語句中使用遺漏的索引資訊

若要將 所 sys.dm_db_missing_index_details 傳回的資訊轉換成記憶體優化索引和磁片型索引的 CREATE INDEX 語句,相等資料行應該放在不等資料行之前,而且它們應該一起建立索引的索引鍵。 您應該使用 INCLUDE 子句,將內含資料行加入 CREATE INDEX 陳述式中。 若要決定相等資料行的有效次序,請依據其選擇性排列這些資料行:將選擇性最高的資料行列在最前面 (資料行清單的最左邊)。 深入瞭解使用 遺漏索引建議 來微調非叢集索引,包括 遺漏索引功能 的限制。

如需記憶體優化索引的詳細資訊,請參閱 記憶體優化資料表 的索引。

交易一致性

如果交易建立或卸載資料表,則會從這個動態管理物件中移除包含遺漏索引資訊的資料列,以保留交易一致性。 深入瞭解 遺漏索引功能 的限制。

權限

在 SQL Server 和 SQL 受控執行個體上,需要 VIEW SERVER STATE 權限。

在SQL 資料庫基本、S0 S1 服務目標上,以及彈性集 區中的 資料庫, 需要伺服器管理員 帳戶、 Microsoft Entra 系統管理員 帳戶或伺服器角色 的成員 ##MS_ServerStateReader## 資格。 在所有其他 SQL Database 服務目標上,需要資料庫的 VIEW DATABASE STATE 權限或 ##MS_ServerStateReader## 伺服器角色的成員資格。

SQL Server 2022 及更新版本的權限

需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。

範例

下列範例會傳回目前資料庫的遺漏索引建議。 遺漏的索引建議應該盡可能與彼此結合,以及目前資料庫中的現有索引。 瞭解如何使用遺漏索引建議 ,在微調非叢集索引中 套用這些建議。

SELECT
  CONVERT (varchar(30), getdate(), 126) AS runtime,  mig.index_group_handle,  mid.index_handle,
  CONVERT (decimal (28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) ) AS improvement_measure,
  'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns, '') + CASE
    WHEN mid.equality_columns IS NOT NULL
    AND mid.inequality_columns IS NOT NULL THEN ','
    ELSE ''
  END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
	INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
	INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE CONVERT (decimal (28, 1),migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

注意

Microsoft Tiger 工具箱中的 Index-Creation 指令碼會檢查遺漏索引 DMV,並自動移除任何多餘的建議索引、剖析出低影響索引,並產生索引建立指令碼以供檢閱。 如同上述查詢,它「不會」執行索引建立命令。 Index-Creation 指令碼適用於 SQL Server 和 Azure SQL 受控執行個體。 若為 Azure SQL 資料庫,請考慮實作自動索引調整

下一步

在下列文章中深入瞭解遺漏的索引功能: