2011-11-02 84 views
0

您好,并感谢提前看看这个。SQL Server - 在两个日期之间搜索的最佳方法

我发现了45个存储过程中的一个问题,其他人写道,她评论说,性能大幅下滑。我在5分钟内看了一眼,发现了问题,进行了一次测试,并从60秒下降到了4秒,其中有一次没有使用索引,并且桌面扫描发生在1000万个+记录。这是使用SQL Server 2005.

该表是一个审计日志,并由存储过程查询以在记录具有特定值时提取updt_tmstmp。我将下面的代码块更改为使用“NOT IN”与8“product_code <>'XX'”语句,将第一个datediff更改为使用索引列updt_tmstmp,并且还添加了AUDIT_LOG.updt_tmstmp> @dtStartDate实现的检查性能提高。我只是觉得这可以以不同的方式实现(更优雅)。我希望对改进有任何想法或想法。

WHERE 
    PRODUCT.product_code NOT IN ('D01', 'D02', 'D03', 'D04', 'D05', 'D06', 'D07', 'D99') AND 
AUDIT_LOG.updt_tmstmp >= @dtStartDate AND 
    --Compares that the date entered is between the two date parameters 
    (DATEDIFF(dd,GETDATE(),AUDIT_LOG.updt_tmstmp) 
     BETWEEN DATEDIFF(dd,GETDATE(),@dtStartDate) 
     AND DATEDIFF(dd,GETDATE(),@dtEndDate)) 
    AND AUDIT_LOG.event_id = (SELECT MIN(AUDIT_LOG.event_id) 
       FROM L_EVENT_LOG 
           WHERE AUDIT_LOG.transaction_id = PRODUCT.transaction_id AND            AUDIT_LOG.queue = 'AP') 

回答

1

audit_log.updt_tmstmp的比较看起来有点奇怪。

AUDIT_LOG.updt_tmstmp >= @dtStartDate AND 
    --Compares that the date entered is between the two date parameters 
    (DATEDIFF(dd,GETDATE(),AUDIT_LOG.updt_tmstmp) 
     BETWEEN DATEDIFF(dd,GETDATE(),@dtStartDate) 
     AND DATEDIFF(dd,GETDATE(),@dtEndDate)) 

我想这样做也是一样。

audit_log.updt_tmstmp >= @dtStartDate and 
audit_log.updt_tmstmp < @dtEndDate 

我不知道如何处理相关的子查询。它使用where子句中外部查询的字段,并且不使用l_event_log中的任何字段。您应该将where子句移到主查询中。

也许是这样的。

where product.product_code not in ('D01', 'D02', 'D03', 'D04', 
            'D05', 'D06', 'D07', 'D99') and 
     audit_log.updt_tmstmp >= @dtStartDate and 
     audit_log.updt_tmstmp < @dtEndDate and 
     audit_log.transaction_id = product.transaction_id and 
     audit_log.queue = 'AP' and 
     l_event_log.event_id = (select min(audit_log.event_id) 
           from l_event_log)  
+0

是的,audit_log.updt_tmstmp看起来很奇怪,我同意。相关的子查询有一个新的编辑完成,我在我们的开发环境中使用索引,并没有改变表名。

1

我想用GETDATE()被调用三次。不知道这是否得到优化,但值得把它放在一个变量开始看看是否有帮助。

相关问题