You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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拼接:复杂的动态生成语句,编译后也会被转换成这种内部表示。

追踪原始查询的方法

  1. 用sys.dm_exec_sql_text获取原始文本
    在SSMS的“近期高开销查询”中找到目标查询,右键选择「查看详细信息」,复制sql_handle的值,执行以下SQL:
SELECT text AS 原始SQL语句
FROM sys.dm_exec_sql_text(0x010006007A2B7C0B00D258...) -- 替换为你的sql_handle值
  1. 排查应用程序代码
    如果是ORM生成的查询,搜索代码中涉及users、orders、sites这几张表的业务逻辑;如果是动态SQL,找拼接这些表的代码片段。
  2. 使用扩展事件或SQL跟踪
    通过SQL Server的扩展事件(推荐)或SQL跟踪,捕获提交到服务器的原始SQL语句,关联到高开销的执行计划。

内容的提问来源于stack exchange,提问作者Joe Defill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:55:37