web-dev-qa-db-ja.com

インデックス付きビューにMAX()集計を含めることができないのはなぜですか?

私はいくつかのインデックスビューを試していて感銘を受けましたが、ほとんどの場合、最大値または最小値も必要であり、なぜこれらで機能しないのか理解できません。誰かが理由を説明できますか?

私は彼らが許可されていないことを知っています、私は理由が理解できません!!!カウントなどは許可されているので、MIN/MAXではないので、説明を探しています...

44
alex

これらの集計は、変更された値のみに基づいて再計算できないため、許可されていません。

COUNT_BIG()SUM()などの一部の集計は、変更されたデータを確認するだけで再計算できます。基になる値が変更された場合、その変更の影響を直接計算できるため、これらはインデックス付きビュー内で許可されます。

MIN()MAX()などの他の集計は、変更されるデータを確認するだけでは再計算できません。現在最大または最小である値を削除する場合は、新しい最大または最小を検索して、全体テーブルで見つける必要があります。

同じ原則が、AVG()や標準のバリエーション集計などの他の集計にも適用されます。 SQLは、変更された値だけからそれらを再計算することはできませんが、新しい値を取得するには、テーブル全体を再スキャンする必要があります。

80
Remus Rusanu

Remusによって指定された理由に加えて、MINとMAXをサポートする必要性はあまりありません。 COUNT()やSUM()とは異なり、MAXとMINは計算が高速です。1回のルックアップですべて設定されます。大量のデータを読み取る必要はありません。

1
A-K

MIN/MAXのような集計関数は、インデックス付きビューではサポートされていません。ビューを囲むクエリでMIN/MAXを実行する必要があります。

インデックス付きビュー内で許可されるものと許可されないものについての完全な定義があります ここ (SQL2005)。
見積もり:

AVG、MAX、MIN、STDEV、STDEVP、VAR、またはVARP集計関数。インデックス付きビューを参照するクエリでAVG(式)が指定されている場合、ビュー選択リストにSUM(式)とCOUNT_BIG(式)が含まれていれば、オプティマイザは必要な結果を頻繁に計算できます。たとえば、インデックス付きビューのSELECTリストに式AVG(column1)を含めることはできません。ビューのSELECTリストに式SUM(column1)およびCOUNT_BIG(column1)が含まれている場合、SQL Serverは、ビューを参照し、AVG(column1)を指定するクエリの平均を計算できます。

1
AdaTheDev

ビューを使用するときに並べ替えを追加せずに並べ替えを表示したいだけの場合は、列を追加して並べ替えるだけです。

id = row_number() over (order by col1, col2) 
0
Verard Sloggett