sys.dm_db_missing_index_details (Transact-SQL)
適用於:SQL Server Azure 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 Database [Basic]、[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 資料庫,請考慮實作自動索引調整。
下一步
在下列文章中深入瞭解遺漏的索引功能: