sys.dm_db_missing_index_group_stats_query (Transact-SQL)
適用於:SQL Server 2019 (15.x) Azure SQL 資料庫 Azure SQL 受控執行個體
傳回需要遺漏索引群組之查詢的相關信息,不包括空間索引。 每個遺漏的索引群組可能會傳回一個以上的查詢。 遺漏的索引群組可能有數個需要相同索引的查詢。
在 Azure SQL Database 中,動態管理檢視不可以公開可能會影響資料庫內含項目的資訊,或公開有關使用者可存取之其他資料庫的資訊。 為了避免公開此資訊,系統會篩選出包含不屬於連線租用戶之資料的每個資料列。
資料行名稱 | 資料類型 | 描述 |
---|---|---|
group_handle | int | 識別遺漏索引的群組。 此標識碼在伺服器中是唯一的。 其他數據行會提供群組中索引視為遺漏之所有查詢的相關信息。 索引群組只包含一個索引。 可以在 sys.dm_db_missing_index_groups 中加入 index_group_handle 。 |
query_hash | binary(8) | 查詢上計算的二進位哈希值,並用來識別具有類似邏輯的查詢。 您可以使用查詢哈希來判斷只有常值不同之查詢的匯總資源使用量。 |
query_plan_hash | binary(8) | 查詢執行計劃上計算的二進位哈希值,並用來識別類似的查詢執行計劃。 您可以使用查詢計劃哈希來尋找具有類似執行計劃之查詢的累計成本。 當原生編譯預存程序查詢記憶體優化數據表時,一律會0x000。 |
last_sql_handle | varbinary(64) | 這是可唯一識別最後一個編譯語句需要此索引之批次或預存程式的令牌。last_sql_handle 可用來藉由呼叫動態管理函式sys.dm_exec_sql_text來擷取查詢的 SQL 文字。 |
last_statement_start_offset | int | 指出,以位元組為單位,從0開始,數據列在其批次文字中描述的查詢起始位置,或針對在其SQL批次中需要此索引的最後一個編譯語句保存物件。 |
last_statement_end_offset | int | 指出,以位元組為單位,從0開始,數據列在其批次文字中描述的查詢結束位置,或針對SQL批次中需要此索引的最後一個編譯語句,保留物件。 |
last_statement_sql_handle | varbinary(64) | 這是可唯一識別最後一個編譯語句需要此索引之批次或預存程式的令牌。 由 查詢存放區 使用。 不同於 last_sql_handle ,sys.query_store_query_text 會參考 statement_sql_handle 查詢存放區 目錄檢視sys.query_store_query_text所使用的 。如果在編譯查詢時未啟用 查詢存放區,則傳回 0。 |
user_seeks | bigint | 使用者查詢導致群組中建議索引可能已用於的搜尋次數。 |
user_scans | bigint | 用戶查詢可能已用於群組中建議索引的掃描數目。 |
last_user_seek | datetime | 上次搜尋的日期和時間,由用戶查詢所造成,群組中建議的索引可能已用於。 |
last_user_scan | datetime | 用戶查詢群組中建議索引可能已用於的最後一次掃描日期和時間。 |
avg_total_user_cost | float | 用戶查詢的平均成本,可由群組中的索引降低。 |
avg_user_impact | float | 實作此遺漏索引群組時,用戶查詢可能會遇到的平均百分比優勢。 值表示如果實作這個遺漏索引群組,查詢成本會平均下降這個百分比。 |
system_seeks | bigint | 系統查詢所造成的搜尋數目,例如自動統計數據查詢,群組中建議的索引可能已用於。 如需詳細資訊,請參閱 Auto Stats 事件類別。 |
system_scans | bigint | 由系統查詢導致群組中建議索引可能已用於的掃描數目。 |
last_system_seek | datetime | 上次系統搜尋的日期和時間,由系統查詢所造成,群組中建議的索引可能已用於。 |
last_system_scan | datetime | 最後一次系統掃描的日期和時間,因為系統查詢中建議的索引可能已用於群組中。 |
avg_total_system_cost | float | 系統查詢的平均成本,可由群組中的索引降低。 |
avg_system_impact | float | 如果實作這個遺漏的索引群組,系統查詢可能會遇到的平均百分比優勢。 值表示如果實作這個遺漏索引群組,查詢成本會平均下降這個百分比。 |
備註
傳 sys.dm_db_missing_index_group_stats_query
回的資訊會由每個查詢執行更新,而不是由每個查詢編譯或重新編譯所傳回。 使用量統計數據不會保存,而且只會在資料庫引擎重新啟動之前保留。
如果資料庫管理員想要在伺服器回收之後保留使用量統計數據,則應該定期製作遺漏索引資訊的備份複本。 使用 sys.dm_os_sys_info 中的 sqlserver_start_time
資料行,來尋找最近一次資料庫引擎啟動時間。 您也可以使用 查詢存放區 保存遺漏的索引。
注意
此 DMV 的結果集限制為 600 個資料列。 每個數據列都包含一個遺漏的索引。 如果您有超過 600 個遺漏的索引,您應該解決現有的遺漏索引,以便您接著檢視較新的索引。
權限
若要查詢此動態管理檢視,用戶必須獲得 VIEW SERVER STATE 許可權或任何暗示 VIEW SERVER STATE 許可權的許可權。
SQL Server 2022 和更新版本的權限
需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。
範例
下列範例說明如何使用 sys.dm_db_missing_index_group_stats_query
動態管理檢視。
A. 尋找用戶查詢前 10 項最高預期改善的最新查詢文字
下列查詢會傳回 10 個遺漏索引的最後一個記錄查詢文字,以遞減順序產生最高預期的累計改善。
SELECT TOP 10
SUBSTRING
(
sql_text.text,
misq.last_statement_start_offset / 2 + 1,
(
CASE misq.last_statement_start_offset
WHEN -1 THEN DATALENGTH(sql_text.text)
ELSE misq.last_statement_end_offset
END - misq.last_statement_start_offset
) / 2 + 1
),
misq.*
FROM sys.dm_db_missing_index_group_stats_query AS misq
CROSS APPLY sys.dm_exec_sql_text(misq.last_sql_handle) AS sql_text
ORDER BY misq.avg_total_user_cost * misq.avg_user_impact * (misq.user_seeks + misq.user_scans) DESC;
下一步
在下列文章中深入瞭解遺漏的索引功能和相關概念:
- 使用遺漏索引建議調整非叢集索引
- sys.dm_db_missing_index_columns (Transact-SQL)
- sys.dm_db_missing_index_details (Transact-SQL)
- sys.dm_db_missing_index_groups (Transact-SQL)
- sys.dm_db_missing_index_group_stats (Transact-SQL)
- sys.dm_exec_sql_text (Transact-SQL)
- CREATE INDEX (Transact-SQL)
- sys.dm_os_sys_info (Transact-SQL)
- 查詢存放區