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)
我无法回答任何关于为什么我需要这样做的问题。谢谢!
这将完美地工作®
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 表达式中省略名称空间前缀。