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 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

sql server都有哪些查询优化方法

SQL Server查询优化方法

SQL Server 'OR' 查询优化

sql Server 查询方法的优化

SQL Server 2005 查询优化

SQL Server 中的 SQL 查询优化