sys.dm_db_missing_index_group_stats_query (Transact-SQL)

適用於:SQL Server 2019 (15.x)Azure SQL DatabaseAzure 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_handlesys.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; 

下一步

在下列文章中深入瞭解遺漏的索引功能和相關概念: