LINKEDSERVER 与 ALIAS

通过对高CPU消耗SQL查询的分析,本文展示了一个具体的SQL性能优化案例。案例中详细介绍了如何使用SQL Server Profiler进行跟踪,定位到具体的问题所在,并最终解决性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过在SQL03上“查找CPU消耗前十的查询”(脚本如下所示)时发现,第一名是一个奇怪的语句。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT  TOP  ( 10 ) 
         SUBSTRING (ST.text,( QS.statement_start_offset /2 ) + 1, 
                   ((  CASE  statement_end_offset 
                         WHEN  -1 THENDATALENGTH(st.text) 
                         ELSE  QS.statement_end_offset 
                       END - QS.statement_start_offset) / 2 ) + 1) 
                  ASstatement_text , 
         execution_count , 
         total_worker_time / 1000 AStotal_worker_time_ms , 
         (total_worker_time / 1000 ) / execution_count 
                  ASavg_worker_time_ms , 
         total_logical_reads , 
         total_logical_reads / execution_count ASavg_logical_reads , 
         total_elapsed_time / 1000 AStotal_elapsed_time_ms , 
         (total_elapsed_time / 1000 ) / execution_count 
                  ASavg_elapsed_time_ms , 
         qp.query_plan
FROM     sys.dm_exec_query_stats qs 
         CROSS  APPLY sys.dm_exec_sql_text(qs.sql_handle) st 
         CROSS  APPLY sys.dm_exec_query_plan(qs.plan_handle) qp 
ORDER  BY  total_worker_time  DESC



wKiom1fAEPihggGMAABTsBRE7hk018.png


语句展开为:

1
2
3
4
5
6
7
SELECT  "Tbl1012" . "FMSKU" "Col1060" , "Tbl1012" . "FMID"  "Col1063" , "Tbl1012" . "ToID" "Col1067" 
FROM  "ARCHIVE" . "dbo" . "Log"  "Tbl1012"  WITH  (NOLOCK) 
WHERE  "Tbl1012" . "ToLotnum" =@P1 
AND  "Tbl1012" . "TransactionType" = 'MV' 
AND  "Tbl1012" . "ReasonCode" = 'PG' 
AND  "Tbl1012" . "FMLocation" like  'STAGE%'  COLLATE  Chinese_PRC_CI_AS 
AND  "Tbl1012" . "ToLocation" like  'STAGE%'  COLLATE  Chinese_PRC_CI_AS


 

发现该语句里的表别名和列别名很奇怪。

 

于是,开启了SQL03上的Profiler跟踪。在“General”标签页,选择Standard模板。在“Events Selection”标签页,选择需要跟踪的事件类,勾选“Show all columns”,这里最关键的几列务必要选择:HostNameSessionLoginNameDatabaseName。然后点击“Column Filters…”,TextDataLike过滤条件中输入%Tbl1012%。开启跟踪。


wKioL1fAEUawkXO6AABbYMjeRV4459.png

wKiom1fAEUag9YbhAAAoKwt0css377.png

wKioL1fAEUfygzoUAADQ6y8Cdwo314.png

根据捕获的输出结果,来源主机为SQL01,会话登录名为ARCHIVE,数据库名为master

 

于是,在SQL01上开启Profiler跟踪。在“General”标签页,选择TSQL_SPs模板。在“Events Selection”标签页,务必选择“SP:StmtStarting”事件类,勾选“Show all columns”,务必选择:LineNumberSessionLoginNameSourceDatabaseID。点击“Column Filters…”,TextDataLike过滤条件输入%STAGE3%。开启跟踪。

 

LineNumber

包含存在错误的行的行号。对于涉及 Transact-SQL 语句的事件,像SP:StmtStartingLineNumber包含的是存储过程或批处理中语句的行号。

参见:https://msdn.microsoft.com/zh-cn/library/ms190762(v=SQL.100).aspx


wKiom1fAEbWC-bTXAABIh0ciK1Q763.png

wKioL1fAEbWDd85FAAAoZqrzol8282.png

wKioL1fAEbexnK-HAAS4YdSe0fE687.png


从捕获的输出中,我们可以知道该语句出自SP2223行附近。于是,找到该SP2223行得到验证。


wKiom1fAEefRiM_IAAH_4GMKeCQ161.png


然后通过该LinkedServer的“Local Login”和“Remote User”的对应关系进一步验证了。


wKioL1fAEjShlqrhAAAQcFxF8gY462.png

wKiom1fAEjSxhFzRAAA3HRyYb_k800.png

wKiom1fAEjSSSAH4AABTSwu7evY211.png

wKioL1fAEjWTSH_TAAA60fiWYNE160.png


总结

 

含有LINKEDSERVER的查询的别名在远端被内部命名为TBLxxxx\COLxxxx









本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1843054 ,如需转载请自行联系原作者












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值