2012-07-30 74 views
2

我有我的MS Sql Server數據庫中的4個視圖,都是相當快(少於2秒),並返回所有少於50行。SQL Server - 加入4個快速查詢給我一個緩慢的查詢

但是當我創建一個查詢,我加入這4個視圖(左外連接)時,我得到一個查詢需要將近一分鐘才能完成。

我認爲查詢優化器在這裏做的不好,有沒有什麼辦法可以加快速度。我很想把4個視圖中的每一個都複製到一張表中,然後將它們結合在一起,但這對我來說似乎是一種太多的解決方法。

(旁註:我不能設置任何索引上的任何表,因爲觀點來自不同的數據庫,我不允許有任何改變,所以這不是一個選項)

編輯:我很抱歉,但我不認爲發佈SQL查詢將有所幫助。它們非常複雜,使用大約50個不同的表格。我無法發佈執行計劃,因爲我沒有足夠的訪問權限來生成某些數據庫的執行計劃。

我想我現在最好的解決方案是生成臨時表來存儲每個查詢的結果。

+2

發佈查詢? – Ghost 2012-07-30 15:16:03

+4

如果不從視圖或查詢計劃的結果中共享SQL,您不可能得到任何有意義的答案。 – 2012-07-30 15:16:45

+1

大部分DBA都願意授予「標準」開發者權限:'授予您的用戶的SHOWPLAN;把你的用戶跟蹤到你的用戶;授予查看服務器狀態給YourUser; 「擁有這些權利將使您的工作變得更加輕鬆。 – Andomar 2012-07-30 15:41:09

回答

5

如果您無法觸摸索引,爲了加快速度,您可以將4個查詢的結果放在4個臨時表中,然後加入它們。

您可以在存儲過程中執行此操作。

+0

臨時表很好用。我使用4條語句'SELECT * INTO#table1 from view1',然後加入表格。結果在2秒而不是54.謝謝。 – Preli 2012-07-30 15:34:54

1

如果您有許多列,請僅包含您需要的列。特別是,如果對列有許多數學運算,數據庫在返回結果時必須轉換所有數字。

還有一點是,做3個查詢有時比做大連接和做1個查詢更好。

然而,沒有具體細節,很難給出正確的建議,超越一般性。

+0

我已經只選擇了我需要的列,我需要在一個視圖中包含所有信息 – Preli 2012-07-30 15:27:19

3

您可以在加入時導出視圖表。

實例:不具有此查詢

 SELECT V1.* FROM dbo.View1 AS V1 INNER JOIN dbo.View2 as V2 
    ON V1.Column1=V2.Column1; 

,你可以有下面的查詢

 SELECT V1.* FROM (SELECT * FROM dbo.View1) AS V1 INNER JOIN (SELECT * FROM dbo.View2) AS V2 
    ON V1.Column1=V2.Column1; 

我希望這能impove性能。