1

要在我的數據庫中執行轉換,我經常使用鏈接的一組視圖。在視圖內將是通用表格表達式。例如,我會具備以下條件:SQL Server 2008:與其他VIEW一起加入VIEW:預計算而不訴諸臨時表

CREATE VIEW TransformationStep1 AS 
    WITH Transformation1A AS (
     SELECT Field1, Field2, Field3, Bla(Field1) AS Calc FROM Table1 
    ), 
    Transformation1B AS (
     SELECT Field1, Field2, Field3, Calc FROM Transformation1A 
    ) 
    SELECT * FROM Transformation1B 

CREATE VIEW TransformationStep2 AS 
    WITH Transformation2A AS (
     SELECT Field1, Calc FROM TransformationStep1 
    ), .... 

某處TransformationStep4附近的查詢計劃變得更加複雜的看法會越來越慢。這是預料之中,並確定。

但是,當我想將TransformationStep4的一部分加入到它本身時,查詢將會非常緩慢,因爲優化器會嘗試一路找回源表並查找某種類型的索引。通常情況下,這是可以的,但有時候我只是想存儲我的臨時結果並加入,因爲(作爲故事中的設計人員)我知道結果表格會很小,加入會更快反對它的「預取」。

有沒有辦法讓我寫一個查詢提示,這將影響查詢計劃的方式,使得子查詢將被預取,然後加入?否則,我將不得不在存儲過程中使用臨時表,但如果可以的話,我想避免它。

感謝您的任何建議,也當你覺得我的設計很爛:-)

回答

4

視圖是一個可擴展的宏:沒有緩存或預取預先計算。

除非你有索引視圖,你可以使用NOEXPAND ..但這些不會在普通的意見。

但是,您可以使用內TOP/ORDER BY物化視圖太:

SELECT 
    * 
FROM 
    (SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1 
    JOIN 
    (SELECT TOP...) bar on foo.x = bar.x 

沒有什麼神奇的一個觀點:這只是文字,也沒有記憶或持續...

+1

TOP作品!太棒了,現在我可以用它來實現我的通用表格表達式。 (我沒有認爲視圖是神奇的,我只是希望能夠操縱查詢優化器不會遞歸到我的CTE中。) – thomaspaulb 2010-10-11 18:30:20