1

データベースで変換を実行するために、連鎖した一連のビューを頻繁に使用します。ビュー内には、共通のテーブル式があります。たとえば、次のようになります。

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

1 に答える 1

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

ビューには魔法のようなものは何もありません: それは単なるテキストであり、記憶や永続性はありません...

于 2010-10-11T18:14:58.003 に答える