【问题标题】:Get list of columns, tables in query from 'show execution plan xml'从“显示执行计划 xml”获取查询中的列、表列表
【发布时间】:2021-06-03 21:22:40
【问题描述】:

我需要从 SQL Server 中的“显示执行计划 xml”的查询中获取用于 select statment、join、where 和 order by 的列表列到一个表中。

例如查询:

Select a.id, a.name, a.gender, a.marks, b.address
From #temp a
Inner join #temp1 b
On a.id=b.id
Where id=1

输出应该是:

Select- id, name, gender, marks(from #temp) 
Address(from #temp1) 
Join - id
Where- id

全部放在一张表中。

【问题讨论】:

  • 因为 Microsoft SQL Server 计划采用 XML 格式,您可以通过使用节点、查询和值 XML 方法解析 XML 来获得所需的一切
  • 您确实意识到几乎不可能获得明确的结果。例如,优化器如何选择过滤索引或索引视图来满足查询?如果连接是一个相关的嵌套循环连接,其中连接条件是内部搜索的谓词,该怎么办?计算列呢?交换连接、省略连接、联合、合并间隔?这是一个绝对的雷区

标签: sql-server xml sql-execution-plan


【解决方案1】:

作为代码示例:

DECLARE @PLAN_XML XML;

--> put here the query you wanted to examine the plan
SELECT DISTINCT name, object_id, create_date 
FROM sys.objects;

SELECT @PLAN_XML = query_plan 
FROM   sys.dm_exec_requests 
       OUTER APPLY sys.dm_exec_query_plan(plan_handle) 
WHERE session_id = @@SPID;

WITH   XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan' )
SELECT CONCAT(x.p.value('(@Schema)', 'sysname'), N'.', 
              x.p.value('(@Table)', 'sysname'), N'.', 
              x.p.value('(@Column)', 'sysname')) AS OUTPUT_COLUMN
FROM   @PLAN_XML.nodes( 'ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[1]/QueryPlan/RelOp/OutputList/*' ) x(p)

这会给你结果:

【讨论】:

  • 在同一个列中如何获取用于连接的列和where子句作为列????
  • 正如我在上面的评论中所说,这是一个很好的例子,说明了为什么这是不可能的。查询的是sys.objects,而不是sys.sysschobjs,下面有各种各样的过滤器和联合谓词
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多