SQL Server 2008:他のビューでビューを結合する:温度テーブルに頼らずに事前に計算する
-
29-09-2019 - |
質問
データベースで変換を実行するために、チェーンズのビューセットを頻繁に使用します。ビュー内には、一般的なテーブル式が表示されます。たとえば、次のことがあります。
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近くのどこかで、クエリプランがより複雑になるにつれてビューは遅くなります。これは予想され、OKです。
しかし、TransformationStep4の一部をそれ自体に結合したい場合、オプティマイザーがソーステーブルに戻って何らかのインデックスを探すために、オプティマイザーが途中で途中で見つけると、クエリが大幅に減速します。通常、これは問題ありませんが、時々私は一時的な結果を保存してそれに参加したいだけなので(ストーリーのデザイン人間であるため)、結果テーブルが非常に小さく、参加する方がはるかに速いことを知っています。それの「プリフェッチ」に対して。
クエリのヒントを書く方法はありますか?それは、サブクエリがプリフェッチされてから参加するような方法でクエリプランに影響を与えますか?それ以外の場合は、ストアドプロシージャで温度テーブルに頼らなければなりませんが、できれば避けたいと思います。
私のデザインが吸うと思うとき、提案をありがとう:-)
解決
ビューは、拡張するマクロです。キャッシングや事前の除去の事前計算はありません。
noExpandを使用できる索引付けビューがない限り..しかし、これらは通常のビューで揺れません。
ただし、ビューを実現するために、内側のトップ/オーダーを使用することもできます。
SELECT
*
FROM
(SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1
JOIN
(SELECT TOP... ) bar on foo.x = bar.x
ビューについて魔法のようなものはありません。それは単なるテキストであり、記憶や持続性がありません...
所属していません StackOverflow