sql server 2000/2008 查询优化
Posted
技术标签:
【中文标题】sql server 2000/2008 查询优化【英文标题】:sql server 2000/2008 query optimization 【发布时间】:2011-09-09 08:47:09 【问题描述】:您能帮我优化以下查询吗?它需要很长时间。
delete from dbo.tgrid_detl
where F_TRANS_CD = 'R'
and SOURCE_ID = 'BVT'
and not exists
(select rr.BVT_SOURCE_KEY
from nurdevusrt.VBVT_RNEWL_RTENTN_DETL RR
where dbo.tgrid_detl.BVT_SOURCE_KEY = rr.BVT_SOURCE_KEY
and YEAR(RR.X_POLICY_XPRTN_DT)>=2009
and rr.F_BVT_DIV_NO not in (37,65,88))
编辑
我使用的是 sql server 2008,但我可以使用 sql server 2000 或 sql server 2008 的语法来优化查询。你能帮忙解决一下吗?
谢谢
【问题讨论】:
您添加了一个 2008 标记,但您的标题显示 2000。它是哪个? 你能发布一个执行计划吗? 抱歉我不能分享执行计划。我没有相同的权限。请帮忙。 【参考方案1】:立即思考:
索引很差或不存在 你有触发器 VBVT_RNEWL_RTENTN_DETL 是一些可怕的观点还有,改变
YEAR(RR.X_POLICY_XPRTN_DT)>=2009
到
RR.X_POLICY_XPRTN_DT >= '20090101' AND RR.X_POLICY_XPRTN_DT < '20100101'
您索引列 x
,而不是 f(x)
,其中 f 是一个函数
【讨论】:
对不起,我没有理解 x 和 f(x) 的含义。我应该索引哪个列。 +1 表示可能存在的其他性能问题和函数注释。 @user863952 - 当您在列 (YEAR(RR.X_POLICY_XPRTN_DT)) 上使用函数时,SQL Server 不能使用索引,而是像 gbn 那样重写语句,坐可以在该列上使用索引。 非常感谢。 m 查询在进行所有这些更改时工作正常。再次感谢。【参考方案2】:您可以尝试遵循等效的语句,但很可能两者都可以
您没有足够的索引或 你的桌子真的很大或者 您的服务器跟不上删除脚本
BEGIN TRAN
DELETE FROM dbo.tgrid_detl
FROM dbo.tgrid_detl
LEFT OUTER JOIN nurdevusrt.VBVT_RNEWL_RTENTN_DETL RR
ON dbo.tgrid_detl.BVT_SOURCE_KEY = rr.BVT_SOURCE_KEY
and YEAR(RR.X_POLICY_XPRTN_DT) >= 2009
and rr.F_BVT_DIV_NO not in (37,65,88)
WHERE rr.BVT_SOURCE_KEY IS NULL
and F_TRANS_CD = 'R'
and SOURCE_ID = 'BVT'
ROLLBACK TRAN
【讨论】:
感谢您的即时回复。这个查询比我发布的查询要好。我有很大的表,请您建议我对这些表进行一些索引,以帮助提高查询性能。 LEFT JOIN 还是 EXISTS 无所谓:EXISTS 通常更好,因为它是半连接 @user863952 - 我的第一次尝试是在 BVT_SOURCE_KEY、F_TRANS_CD 和 SOURCE_ID 上创建一个覆盖索引。 ... 以及 BVT_SOURCE_KEY、X_POLICY_XPRTN_DT 和 F_BVT_DIV_NO 非常感谢。 m 查询在进行所有这些更改时工作正常。再次感谢。以上是关于sql server 2000/2008 查询优化的主要内容,如果未能解决你的问题,请参考以下文章