2005年10月06日

インデックス付きビュー

SQL Server 2000 (Enterprise Edition) 以降のみ ← SQL Server 7.0 以前はインデックスはテーブルにのみ使用
ビュー:結合、集計、またはその組み合わせを含む
            SELECT ステートメントに名前をつけたもの。名前を指定することで参照可 → 実体なし
ビューにインデックスを作成することで、ビューの結果セットが物理的にデータベースに保存
    → 実体を持つ
テーブルインデックスと同様自動保守
オプティマイザは、ビューが直接クエリの中で参照されていなくてもビュー上のインデックスの使用を考慮
インデックスが参照できるのはベーステーブルのみ → 他ビューは参照不可

○ インデックスビュー作成のガイドライン
効果的な場合
  意思決定支援システム(検索系)
  大きなテーブルの結合、集計
  クエリの繰り返しパターン
    ‥同列セット集計の繰り返し
    ‥同テーブルの同キーの結合の繰り返し
非効果的な場合
  書き込みが頻繁な OLTP (オンライントランザクション処理)
  重い更新処理を伴うデータベース
  結合により元テーブルより結果セット行数が多くなるビュー
  異なる値を多く含むキーの集計

○ ビュー作成要件
ビューとデータベースをバインド → ベーステーブルの変更、削除を防止
  CREATE VIEW ... WITH SCHEMABINDING オプション
テーブルとユーザー定義関数は名前の参照に所有者名が必須
インデックス列の関数は決定的な関数
 
決定的関数 特定の入力値セットで呼び出されるたびに常に同じ結果を返す ABS、DATEADD、SQRT 等
非決定的関数 呼び出されるたびに異なる結果を返す GETDATE、NEWID、DATENAME 等
GROUP BY 句が指定されている場合、ビューの選択リストに集計式を含められない
GROUP BY 句が指定されている場合、ビューの選択リストに COUNT_BIG(*) が含まれている必要あり
  COUNT(*) ではエラーとなる
  COUNT_BIG 関数 … bigint に対応した集計関数

○ インデックス作成要件
複数インデックスを作成可、ただし最初に一意なクラスタ化インデックスを作成する必要あり
  CREATE UNIQUE CLUSTERD INDEX...
SET オプションの条件
  ON でなければならないオプション
    ANSI_NULLS
    ANSI_PADDING
    ANSI_WARNINGS
    ARITHABORT
    CONCAT_NULL
    YIELDS_NULL
    QUOTED_IDENTIFIERS
  OFF でならなければならないオプション
    NUMERIC_ROUNDABORT
  DBCC USEROPTIONS ステートメントで確認可
【参照】 SQL Server 2000 Books Online 「インデックス付きのビューの作成」
インデックス付きビューの作成の可否は OBJECTPROPERTY 関数の IsIndexable プロパティで確認可
  SELECT OBJECTPROPERTY (オブジェクトID, 'IsIndexable') → 1 が返ってくれば作成可
posted by w@ko at 19:18|  ・SQL Server ノート | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。