Sql-Server
如何查看索引是否正在從 DMV 中“訂購”
我有一個用於許多報告查詢的表。我想知道以“有序”方式讀取表格的次數。在聚集索引掃描的執行計劃中,可以查看讀取是否“有序”。此資訊是否在其他地方可用,或者是搜尋計劃記憶體的唯一解決方案?
查詢計劃中的數據僅指示查詢計劃是否需要有序掃描,或者分配順序掃描是否也可以工作。即使查詢計劃不需要有序掃描,您通常還是會得到一個,因為分配順序掃描僅在特定情況下才允許,正如 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