我在链接服务器上有这个查询
Select a.PawnMainID into #ExistingID
from Beautifly.BIOS_PAWN.dbo.tblPawnMain a
inner join Transactions.tbl_PawnMain c
on a.PawnMainID = c.fld_PawnMainID
inner join Reference.tbl_BranchRowVersions b
on cast(a.[PawnMainID]/1000000000000 as decimal (38,0)) = b.fld_ID
where (a.StatusID between 3 and 5)
AND a.RowVersionBo > b.fld_MaxRowVersion
并且它需要永远完成,而其他代码似乎是正常的,你可以帮助我找出问题吗?我的代码注释足够有效吗?如果是这样我怎么能改善它?
下面的图片显示我的执行计划重新远程查询成本为99%!
我还想问一下我的代码是否已经过优化?如果不是我怎么能优化它?
答案 0 :(得分:3)
对远程服务器的查询总是很昂贵,首先它将建立连接,查询数据,返回结果然后关闭连接。因此,为了使查询更快,最简单的选择是,从临时表中的远程服务器获取数据,然后执行查询。
答案 1 :(得分:1)
嗯,你的代码有点难以阅读,但我会采取措施:tblPawnMain
(a)和tbl_BranchRowVersions
(b)之间的JOIN语句不是{{3 }}:
ON CAST(a.[PawnMainID]/1000000000000 AS decimal (38,0)) = b.fld_ID
在评估函数之前,SQL Server不知道CAST的结果。因此,它必须抓住tblPawnMain
和tbl_BranchRowVersions
的每一行。从远程查询运算符出来的细箭头告诉sme结果集很小,但是JOIN可能很昂贵,因为它们是巨大的表并且执行了CROSS JOIN。
尝试直接从Beautifly
服务器运行此命令并发布您的执行计划:
SELECT a.PawnMainID, b.fld_ID
FROM Beautifly.BIOS_PAWN.dbo.tblPawnMain a
INNER JOIN Reference.tbl_BranchRowVersions b
ON CAST(a.[PawnMainID]/1000000000000 as decimal (38,0)) = b.fld_ID
WHERE (a.StatusID BETWEEN 3 AND 5)
AND a.RowVersionBo > b.fld_MaxRowVersion
如果您经常使用该CAST加入这两个表,则可能需要在tblPawnMain
上添加CAST(a.[PawnMainID]/1000000000000 as decimal (38,0))
的列并在其上添加索引。你的JOIN将具有可预测性。
答案 2 :(得分:-3)
也许这最适合拆分让ASP做密集,这样可以防止数据库锁定其他客户端。