2

Sql Server 2016 で、単純な親子関係を要約するインデックス付きビュー (または同等のもの) を作成することは可能ですか?

例えば:

Parent: Vehicles
Children: Parts  (the parts that make up the car)
Children: Workers (the people who helped build the car)

そして、このような結果..例:

Car   | Parts  | Workers
Car_A | 1111   | 4
Car_B | 123412 | 54
Car_C | 0      | 0

これを SQL クエリとして記述した場合は、次のようになります (これはインデックスが作成されておらず、回答全体を「計算」する必要があると想定しています)。

SELECT          a.CarId
FROM            Cars a
LEFT OUTER JOIN Parts b ON a.CarId = b.CarId
LEFT OUTER JOIN Workers c ON a.CarId = b.CarId

「INDEXED」ビューを求めている理由は、計算がディスクに保存されていると想定しているため、結果を計算するのではなく、インデックスをスキャンして結果を取得するだけでよいからです。実行。

上記の例も悔やまれます(この質問の場合)。実際には、より大きなテーブル構造などがあります。

インデックス付きビューに特定のキーワードを含めることができないことは理解しています( @brentozar がブログ投稿でCOUNT述べたように) 。

私はこの問題を間違った方法で見ていますか? ここでは、SQL キャッシングについてはあまり回答したくありません。

(注: 多分私は別の NoSql db で多くの Map/Reduce クエリを実行してきました:))

4

1 に答える 1

0

確かにあなたはそれを作ることができます。データはディスクに永続化されるため、クエリは高速になりますが、基になるテーブル/ビュー データが変更されるたびにインデックス (またはビュー) を維持する必要があるという欠点があります。

詳細については、こちらをお読みください

編集: COUNT( )の代わりにCOUNT_BIG()を使用して、パーツとワーカーの番号を取得する必要があります。

EDIT2:以下の著者のコメントの後、結合に関するすべてであることを理解していないため、間違いを犯したことがわかりました。車両を集約していることを考えると、これに対する優れた解決策はわかりません...

私が見ることができる唯一の解決策は、データに特定の「ラグ」を持たせたい場合です。その後、データをテーブルにダンプできます。一時テーブル/テーブル変数で選択を計算し、トランザクション内でテーブルを切り捨て、新しい集計データをそこにダンプするジョブを作成できます。この方法では、テーブルからデータにすばやくアクセスでき、古いデータと新しいデータの交換が高速になりますが、前述したように、完全にリアルタイムのデータにはなりません。

于 2017-01-09T08:19:58.457 に答える