2011-11-02 64 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()被調用三次。不知道這是否得到優化,但值得把它放在一個變量開始看看是否有幫助。

相關問題