2013-11-25 124 views
-1

我需要幫助來優化此查詢。在存儲過程中,該部分執行1小時(所有過程需要執行2個)。過程適用於大量數據。查詢適用於兩個臨時表。兩者都使用索引:如何優化緩慢的SQL查詢

create unique clustered index #cx_tDuguje on #tDuguje (Partija, Referenca, Konto, Valuta, DatumValute) 
create nonclustered index #cx_tDuguje_1 on #tDuguje (Partija, Valuta, Referenca, Konto, sIznos) 
create unique clustered index #cx_tPotrazuje on #tPotrazuje (Partija, Referenca, Konto, Valuta, DatumValute) 
create nonclustered index #cx_tPotrazuje_1 on #tPotrazuje (Partija, Valuta, Referenca, Konto, pIznos) 

這是一個查詢:

select D.Partija, 
     D.Referenca, 
     D.Konto, 
     D.Valuta, 
     D.DatumValute DatumZad, 
     NULLIF(MAX(COALESCE(P.DatumValute,@NextDay)), ,@NextDay) DatumUpl, 
     MAX(D.DospObaveze) DospObaveze, 
     MAX(D.LimitMatZn) LimitMatZn 
into #dwkKasnjenja_WNT 
from #tDuguje D 
left join #tPotrazuje P on D.Partija = P.Partija 
         AND D.Valuta = p.Valuta 
         AND D.Referenca = p.Referenca 
         AND D.Konto = P.Konto 
         and P.pIznos < D.sIznos and D.sIznos <= P.Iznos 
WHERE 1=1 
    AND D.DatumValute IS NOT NULL 
GROUP BY D.Partija, D.Referenca, D.Konto, D.Valuta, D.DatumValute 

我和執行計劃,但我沒有啓用它張貼在這裏。

回答

0

只是一個想法:如果您被允許這樣做,請嘗試首先更改業務邏輯。

也許你限制結果集只包括來自某個時間點的數據,比如有意義的時間點。

您的帳戶數據到達多久? 真的需要包含從1999年的老年人回來的所有數據嗎?

也許你可以說

D.DatumValute> =「2010年1月1日」

或類似的,你的WHERE子句

中,這可能創建一個使用更小的臨時結果集在你複雜的JOIN子句中運行得更快。

如果你不能做到這一點,也許做一個 「select top top ... order by datum desc」查詢,它可能運行得更快,然後如果用戶真的需要,慢慢地運行查詢第二步。

+0

謝謝...已經與客戶討論過這個問題,並且會再次嘗試解釋,但是現在他們想要使用存檔數據......數以百萬計的數據。不過謝謝。 – Nina

+0

然後添加一個臨時數據表(或物化視圖),其中包含間隔列表的兩列(我猜這就是'...和P.pIznos knb

0

很難說沒有一個執行計劃或有關每個表中的行數的提示。

替換該指數

create nonclustered index #cx_tPotrazuje_1 on #tPotrazuje (Partija, Valuta, Referenca, Konto, pIznos) 

通過

create nonclustered index #cx_tPotrazuje_1 on #tPotrazuje (Partija, Valuta, Referenca, Konto, sIznos, pIznos) 
0

索引的創建是一個非常昂貴的過程,它可能是緩慢的,有時,還可以根據實例的工作負荷和列涉及,爲其創建索引。

此外,如果沒有執行計劃並且不瞭解索引創建中涉及的列的數據類型,就很難說出需要優化的內容。

例如,列Partija, Referenca, Konto, Valuta, DatumValute的數據類型不太清楚。 您應該告訴我們創建索引所涉及的列的數據類型。

+0

謝謝你的回答。數據類型爲: [Partija] [varchar](20), [Referenca] [varchar](60), [Konto] [varchar](10), [Valuta] [varchar](3), [ DatumValute] [varchar](10) 和P.pIznos,D.sIznos和P.Iznos是十進制(19,2)。 我無法發佈你的執行計劃。 – Nina