0

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

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%! 图片

我还想问一下我的代码是否优化了?如果不是,我该如何优化它?

4

2 回答 2

3

查询远程服务器总是很昂贵的,因为首先它会建立连接,查询数据,返回结果,然后关闭连接。因此,为了使查询更快,最简单的选择是从临时表中的远程服务器获取数据,然后执行查询。

于 2013-09-12T02:22:06.280 回答
1

好吧,你的代码读起来有点痛苦,但我会试一试: tblPawnMain(a) 和tbl_BranchRowVersions(b) 之间的 JOIN 语句不是SARGABLE

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 连接这两个表,则可能值得在其上添加一列并在tblPawnMainCAST(a.[PawnMainID]/1000000000000 as decimal (38,0))上放置索引。然后,您的 JOIN 将成为 SARGEABLE。

于 2013-09-12T02:45:07.993 回答