Sql-Server

如何查看索引是否正在從 DMV 中“訂購”

  • April 2, 2021

我有一個用於許多報告查詢的表。我想知道以“有序”方式讀取表格的次數。在聚集索引掃描的執行計劃中,可以查看讀取是否“有序”。此資訊是否在其他地方可用,或者是搜尋計劃記憶體的唯一解決方案?

查詢計劃中的數據僅指示查詢計劃是否需要有序掃描,或者分配順序掃描是否也可以工作。即使查詢計劃不需要有序掃描,您通常還是會得到一個,因為分配順序掃描僅在特定情況下才允許,正如 Paul White在這裡解釋的那樣。

所以由於這些數據是關於查詢計劃的,而不是掃描方法,它只在查詢計劃中可用。

假設您在變數中有一個查詢計劃,@plan您可以使用它:

WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT IndexScan.value('concat(@Database,".",@Schema,".",@Table,".",@Index)', 'nvarchar(516)')
FROM @x.nodes('//IndexScan[@Ordered = "false"]/Object') AS n(IndexScan)

因此,要從每個查詢計劃中獲取此資訊,您可以執行以下操作:

WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT x2.IndexName, SUM(stat.execution_count) TotalExecutionCount
FROM sys.dm_exec_query_stats stat
CROSS APPLY sys.dm_exec_query_plan(stat.plan_handle) pln
CROSS APPLY pln.query_plan.nodes('//IndexScan[@Ordered = "true" or @Ordered = "1"]/Object') AS x(IndexScan)
CROSS APPLY (VALUES (IndexScan.value('concat(@Database,".",@Schema,".",@Table,".",@Index)', 'nvarchar(516)'))) AS x2(IndexName)
GROUP BY x2.IndexName

引用自:https://dba.stackexchange.com/questions/289113