2011-09-26 82 views
1

我正在嘗試創建視圖,但從此視圖中選擇語句需要超過15秒。如何使其更快。我對該視圖的查詢如下。創建視圖,SQL查詢性能

create view Summary as 

select distinct A.Process_date,A.SN,A.New,A.Processing, 

COUNT(case when B.type='Sold' and A.status='Processing' then 1 end) as Sold, 

COUNT(case when B.type='Repaired' and A.status='Processing' then 1 end) as Repaired, 

COUNT(case when B.type='Returned' and A.status='Processing' then 1 end) as Returned 

from 

(select distinct M.Process_date,M.SN,max(P.enter_date) as enter_date,M.status, 

COUNT(case when M.status='New' then 1 end) as New, 

COUNT(case when M.status='Processing' and P.cn is null then 1 end) as Processing 

from DB1.dbo.Item_details M 

left outer join DB2.dbo.track_data P on M.SN=P.SN 

group by M.Process_date,M.SN,M.status) A 

left outer join DB2.dbo.track_data B on A.SN=B.SN 

where A.enter_date=B.enter_date or A.enter_date is null 

group by A.Process_date,A.New,A.Processing,A.SN 

這view..my選擇查詢後

select distinct process_date,sum(New),sum(Processing),sum(sold),sum(repaired),sum(returned) from Summary where month(process_date)=03 and year(process_date)=2011 

請建議我什麼改變來進行的查詢執行得更快。

謝謝 ARB

+1

重複使用'select distinct ...'是第一個跡象表明一切都不好 - 如果你得到重複的行,爲什麼?以合理的方式消除重複,而不是像「select distinct ...」那樣使用創可貼是首先要解決的問題。 –

+1

'Distinct'不是爲你做任何事情,'組by'已經使結果不同。可能不會加速任何東西,因爲查詢優化器會知道,不同的是多餘的,但沒有額外的關鍵字視圖定義會更清晰。 –

回答

1

這是很難給意見沒有看到實際的數據和表的結構。我會重寫這些查詢記住這些原則:

  1. 如果可能,請使用內部聯接而不是外部聯接。
  2. 擺脫COUNT函數內的case操作符。構建查詢,以便在COUNT中的WHERE部分中使用條件。
  3. 儘量不要在GROUP BY中使用聚合值。目前,您使用聚合值New和分組處理。如果可能的話,使用現有表值的GROUP BY。
  4. 如果查詢太複雜,請將其分解爲更小的查詢並將結果合併到最終查詢中。在這種情況下編寫存儲過程可能會有所幫助。

我希望這會有所幫助。

+0

我已經打聽到你放什麼在這裏,在不同的答案。 – Kangkan

0

如果你正在使用Postgresql,我建議你使用一個像「http://explain.depesz.com/」這樣的工具,以便更清楚地看到你的查詢的哪一部分很慢。根據你得到的結果,你可以優化你的索引,或者重寫你的部分查詢。如果您正在使用其他數據庫,我確定存在類似的工具。

如果這些想法都沒有幫助,最終的解決方案是創建一個「物化查詢」。網上有很多關於此的信息。

祝你好運。

1

調諧數據庫查詢,我將增加額外的什麼@Davyd已經上市的幾個項目:

  1. 看錶和索引這些表。把正確的索引和避免錯誤的索引加速查詢。
  2. Where條件中是否有任何不屬於任何索引的部分?有時我們把索引放在一列上,在查詢中我們在列上使用了轉換或轉換。所以基礎指數並不有效。您可以考慮在列的轉換/轉換中設置索引。
  3. 看看正常形式的整合還是過於正常化。 3.

祝你好運。

+0

好點。我認爲如果在連接中使用這些字段,他應該已經有了索引。 – Davyd

+0

感謝球員...我沒有我的表中的任何索引..我想我應該考慮這樣做,現在.. @Davyd:我的印象中,我使用的CASE操作的方式提高查詢性能..呵呵下...我會再試一次.. :) – ARB

+0

@ARB:好,你有繼續的方式。祝你好運! – Kangkan