查询执行时间过长(25分钟)

时间:2013-09-12 02:01:53

标签: sql-server tsql sql-server-2005 sql-server-2008-r2 compatibility

我在链接服务器上有这个查询

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%! PIcture

我还想问一下我的代码是否已经过优化?如果不是我怎么能优化它?

3 个答案:

答案 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的结果。因此,它必须抓住tblPawnMaintbl_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做密集,这样可以防止数据库锁定其他客户端。