ファクト コンステレーション スキーマ設計の SQL Server データ ウェアハウスがあります。4 つのオブジェクト/ビューに関するレポートを作成する必要があります。
- 販売実績 - ファクト テーブル [販売]
- 販売目標 - ファクト テーブル [目標]
- 株式 - ファクト テーブル [Inventory]
- インバウンド - ファクト テーブル [トランジット]
すべてのオブジェクト/ビューには同じ署名があります。次に例を示します。
Sales actuals: ProductID, RegionID, SalesManagerID, ..., <product data>, <region data>, ..., Quantity;
Sales targets: ProductID, --null--, SalesManagerID, ..., <product data>, -----null----, ..., Quantity;
Stocks: ProductID, RegionID, -----null-----, ..., <product data>, <region data>, ..., Quantity;
...
このような署名を実現するために、各オブジェクト/ビューはファクト テーブルと 5 ~ 6 個のディメンション テーブルから取得されます。ディメンション テーブルはオブジェクト間で共有されます (製品データを含むテーブル、地域データを含むテーブルなど)。
各ビューの計算に 5 ~ 10 秒以上かかる SQL はありません。
それらを 1 つのレポートにまとめたいので、次のようにしています。
Select * from [Sales actuals]
UNION
Select * from [Sales targets]
UNION
Select * from [Stocks]
UNION
Select * from [Inbound]
そしてここで、SQL は 1 分以内にデータの 10% を取得することさえできません。クエリ オプティマイザーは、4 つのファクト テーブルを 1 つの大きなベクトルに結合し、ディメンション テーブルをアタッチしているようです。これにより、システムが狂ってしまいます。
私が望むのは、ビュー/オブジェクトをカプセル化したままにすることです。つまり、エンジンは最初にビューを計算する必要があります (4 * 5 秒 = 20 秒)。その後、Union 操作 (10 秒 + オーバーヘッド) を適用して結果を取得します。
質問: ネストされたビューでクエリの最適化を無効にして、そのような「計算カプセル化」を実現するにはどうすればよいですか?
コンパイラと同じように、最初にファクト テーブルを結合してからディメンション テーブルを結合します。これはオプションではありません。コードを解釈可能にして再利用可能にしたいからです。
前もって感謝します!コンスタンティン