適用於: SQL Server 2019 (15.x) 及後續版本
Azure SQL 資料庫
Azure SQL Managed Instance
SQL 資料庫 in Microsoft Fabric
傳回需要遺漏索引群組之查詢的相關信息,不包括空間索引。 每個缺失的索引群組可能會回傳多個查詢。 一個缺失的索引群組可能包含多個需要相同索引的查詢。
在 Azure SQL 資料庫中,動態管理檢視無法暴露會影響資料庫包含性的資訊,也無法暴露使用者可存取的其他資料庫資訊。 為了避免公開此資訊,系統會篩選出包含不屬於連線租用戶之資料的每個資料列。
| 資料行名稱 | 資料類型 | 描述 |
|---|---|---|
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 回的資訊會由每個查詢執行更新,而不是由每個查詢編譯或重新編譯所傳回。 使用統計不會被持久保存,只會保留到資料庫引擎重新啟動為止。
如果資料庫管理員想要在伺服器回收之後保留使用量統計數據,則應該定期製作遺漏索引資訊的備份複本。 使用 sqlserver_start_time 中的 資料行,來尋找最近一次資料庫引擎啟動時間。 您也可以使用 查詢存放區 保存遺漏的索引。
權限
要查詢此動態管理檢視,使用者必須獲得 VIEW SERVER STATE 權限或任何暗示該 VIEW SERVER STATE 權限的權限,適用於 SQL Server 2019(15.x)及更早版本。
需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限,適用於 SQL Server 2022(16.x)及更新版本。
範例
下列範例說明如何使用 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)
- 創建索引(Transact-SQL)
- sys.dm_os_sys_info (Transact-SQL)
- 使用查詢存放區監視效能