为何SSMS中查询的表与列显示为数字而非原名?
为什么SSMS“近期高开销查询”中的SQL用数字替代表和列原名?
我在SSMS的“近期高开销查询”里找到一段资源占用极高的SQL,它的表和列都用数字后缀的名称(比如Col1856、Tbl1010)替代了原名,完全没法直接对应到业务代码里的查询,示例如下:
SELECT "Col1856", "Col1857", "Col1858", "Expr1041" FROM (SELECT "Col1856", "Col1857", CONVERT(nvarchar(50), "Col1862",0) "Expr1041" FROM (SELECT "Tbl1010"."user_id" "Col1848", "Tbl1010"."first_name" "Col1849", "Tbl1010"."last_name" "Col1850" FROM "Web"."dbo"."users" "Tbl1010") Qry1854, (SELECT "Tbl1004"."cart_id" "Col1856", "Col1863", "Tbl1004"."date_stamp" "Col1859", "Tbl1004"."isQuote" "Col1871", "Tbl1004"."isSavedForLater" "Col1872", "Tbl1008"."accountNum" "Col1878", "Tbl1008"."s_id" "Col1876" FROM "MyDB"."dbo"."orders" "Tbl1004", "Web"."dbo"."sites" "Tbl1008" WHERE CONVERT(nvarchar(50), "Tbl1004"."code",0) = "Tbl1008"."code") Qry1880 WHERE "Col1857" = "Col1848") Qry1881 ORDER BY "Col1879" ASC, "Expr1041" ASC
原因解析
这不是原始提交的SQL语句,而是SQL Server编译查询后生成的内部规范化表示:
- SQL Server在处理查询时,会将原始SQL转换成内部的执行计划结构,为了避免命名冲突、简化优化逻辑,会给临时子查询、列、表达式自动分配这类带数字后缀的标识符(
TblXXXX代表临时表/表别名,ColXXXX代表列,ExprXXXX代表计算表达式)。 - 常见触发场景:
- 查询由ORM框架(比如EF、NHibernate)自动生成:这类工具会生成嵌套复杂的查询,编译后就会呈现这种形式。
- 查询包含多层子查询、视图或存储过程:SQL Server在展开这些对象时,会重命名内部元素以避免冲突。
- 查询来自应用程序的动态SQL拼接:复杂的动态生成语句,编译后也会被转换成这种内部表示。
追踪原始查询的方法
- 用
sys.dm_exec_sql_text获取原始文本
在SSMS的“近期高开销查询”中找到目标查询,右键选择「查看详细信息」,复制sql_handle的值,执行以下SQL:
SELECT text AS 原始SQL语句 FROM sys.dm_exec_sql_text(0x010006007A2B7C0B00D258...) -- 替换为你的sql_handle值
- 排查应用程序代码
如果是ORM生成的查询,搜索代码中涉及users、orders、sites这几张表的业务逻辑;如果是动态SQL,找拼接这些表的代码片段。 - 使用扩展事件或SQL跟踪
通过SQL Server的扩展事件(推荐)或SQL跟踪,捕获提交到服务器的原始SQL语句,关联到高开销的执行计划。
内容的提问来源于stack exchange,提问作者Joe Defill
相关产品推荐
相关产品推荐

