共用方式為


sys.dm_db_missing_index_details (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫 Azure 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 資料庫,請考慮實作自動索引調整

下一步

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