2014-09-04 100 views
1

前言中,此查詢將db_links用於oracle環境,目前正在TOAD中針對SQL Server數據庫執行。SQL Server - 查詢花費很長時間使用硬編碼日期

我最初有一些日期變量,用戶可以輸入日期範圍,當使用這些變量時,查詢在15秒內執行。當我手動插入變量的同一日期進行硬編碼時,查詢現在需要3.5分鐘。

爲什麼我的查詢從15秒變爲3.5分鐘,而不是使用日期變量來硬編碼日期?

這裏是下面的查詢:

select TRANS.FGBTRNH_DOC_CODE, 
     '' "calc1", 
     TRANS.FGBTRNH_TRANS_DESC, 
     case when TRANS.FGBTRNH_DR_CR_IND = 'C' then TRANS.FGBTRNH_TRANS_AMT *-1 
       when TRANS.FGBTRNH_DR_CR_IND = 'D' then TRANS.FGBTRNH_TRANS_AMT 
       end "calc2", 
     CAST(TRANS.FGBTRNH_TRANS_DATE AS DATE) "calc3" 
    from [BANTEST.UNWSP.EDU]..FIMSMGR.FGBTRNH TRANS 
inner join [BANTEST.UNWSP.EDU]..FIMSMGR.FABINVH INVOICE on TRANS.FGBTRNH_DOC_CODE = INVOICE.FABINVH_CODE 

where TRANS.FGBTRNH_ACCT_CODE = '19000' 
     and TRANS.FGBTRNH_TRANS_DATE between convert(date,'08/01/2013') and convert(date,'08/31/2013') 
     and TRANS.FGBTRNH_DOC_CODE not like 'J%' 
     and TRANS.FGBTRNH_TRANS_DESC not like '%AMAZON%' 
     and TRANS.FGBTRNH_POSTING_PERIOD <>'00' 
     and (TRANS.FGBTRNH_RUCL_CODE not like 'CA%' 
     and TRANS.FGBTRNH_RUCL_CODE not like 'Y%') 

當我使用變量的條件語句是這樣的:

和TRANS.FGBTRNH_TRANS_DATE之間:日期1和:date2的

蟾蜍則提示爲什麼的價值:date1和:date2

+0

而且該聲明在第二次執行中也使用相同的硬編碼日期也需要很長時間? – 2014-09-04 13:43:18

回答

1

唯一突出的是CONVERT。請沒有它嘗試如下:

TRANS.FGBTRNH_TRANS_DATE between '2013-08-01' and '2013-08-31' 
+0

我用你提供的參數運行它,它運行的時間相同。 – 2014-09-05 15:54:42

-1

當您使用的參數(「變量」),該服務器可以再利用的執行計劃,因爲查詢是一樣的一個你已經執行。

如果您不使用參數,則每次更改日期時,服務器都會將其識別爲另一個查詢,並且必須構建新的執行計劃,這需要時間。

+0

雖然你說的是真的,但我發現很難想象解析會增加3分鐘和15個seocnds ....(執行時間從15秒增加到3.5分鐘。) – 2014-09-04 14:05:50

+0

@ MarkJ.Bobak當你發現它很難,並不意味着它不會發生。我已經看到使用鏈接服務器時會發生這種情況,情況就是如此。我沒有談論「解析」。我談到了「執行計劃」,這是一個非常不同的事情。 – 2014-09-04 14:08:09

+0

即使我第一次執行這兩個查詢中的任何一個,他們仍然需要15秒的變量或3.5分鐘的硬編碼日期。如果我一直運行帶有硬編碼日期的版本而不更改日期,則每次仍需要3.5分鐘。 – 2014-09-05 15:53:55