如何解析查询计划以获取具有无序预取的嵌套循环运算符的计数?

rel*_*dba 5 xml sql-server execution-plan xquery

我的老板要我解析存储在表中的一组查询计划,并确定每个计划中存在多少具有无序预取的嵌套循环运算符。我只有大约 100 个查询计划,所以性能不是很重要。我尝试自己做,但很快就糊涂了,无法取得进展。

表的结构:

DROP TABLE IF EXISTS dbo.query_plans;

CREATE TABLE dbo.query_plans (
plan_name VARCHAR(100),
query_xml XML
);
Run Code Online (Sandbox Code Playgroud)

我上传了 T-SQL 以向pastebin上的表添加三个示例查询计划。这是我正在寻找的输出:

????????????????????????????????
?  plan_name  ? OPERATOR_COUNT ?
????????????????????????????????
? NO_PREFETCH ?              0 ?
? 1_PREFETCH  ?              1 ?
? 2_PREFETCH  ?              2 ?
????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我无法回答任何关于为什么我需要这样做的问题。谢谢!

Eri*_*ing 9

这将完美地工作®

WITH XMLNAMESPACES ( 'http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p )
SELECT qp.plan_name, 
       qp.query_xml.value('count(//p:RelOp/p:NestedLoops/@WithUnorderedPrefetch)', 'int') AS operator_count
FROM dbo.query_plans AS qp;
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以使用

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
Run Code Online (Sandbox Code Playgroud)

...并p:从 XQuery 表达式中省略名称空间前缀。