SQLServer2000 以降ではビューにインデックスが付けられます。インデックス付きビューと呼ぶそうです。
インデックスを作成するには色々と条件があり、本当にインデックスを作成した方がパフォーマンスが上がるのかよく検討した方が良いようですが、インデックス付きビューが利用出来そうならパフォーマンス的には良くなるのでは?と思うので、もしパフォーマンスに不満がある時は、挑戦してみた方が良いかと思います。


ビューの作成

とりあえず作成する時のサンプルは下記のような感じになります。

SET NUMERIC_ROUNDABORT OFF;
SET ANSI_NULLS
, ANSI_PADDING
, ANSI_WARNINGS
, CONCAT_NULL_YIELDS_NULL
, QUOTED_IDENTIFIER ON;
GO
CREATE View vHoge
WITH SCHEMABINDING
AS
SELECT
H1.ID
,H1.Code
,H2.Name
,H2.Memo
FROM dbo.Hoge1 H1
JOIN dbo.Hoge2 H2
ON H1.Code=H2.Code
GO
CREATE UNIQUE CLUSTERED INDEX PK_vHoge
ON vHoge (ID,Code);
GO

最初のSETオプションは、インデックス付きビューを作成する際に必要なオプションの設定です。
次に、Create View の次の行にある「WITH SCHEMABINDING」です。
詳しくはヘルプや下記の参考のリンクを見てください。
主にこの2点があればインデックス付きビューは作成出来ます。

作成条件

SQLステートメントの内容に条件が幾つかあるので実務上インデックスが作成出来ない事もあり得ます。
私が使用するにあたって作成を断念した主な条件を挙げると次のような感じです。

  1. FROM句でサブクエリを使用している。
  2. MIN、MAX関数を使用している。
  3. 自己参照型のJOINを使用している(例:FROM Hoge JOIN Hoge)

1番目の問題は、サブクエリ部分を別のビューにしてしまえば、解決出来るかもしれませんね。
但しサブクエリだらけだと、ビューが沢山出来てしまいますが・・・。
実際には他にも条件はあるのでヘルプや下記の参考のリンクを見てください。

作成時の注意点

条件的には満たしていても作成時にエラーが発生してしまうという場合の注意点としては下記のような感じでした。

  1. 更に別のビューや関数を使用しているときは、別のビューや関数内も作成条件に合わないと作成出来ない。
  2. 使用される側のビューや関数にも「WITH SCHEMABINDING」の指定が必要になる。
  3. 使用しているテーブルやビューにはスキーマ指定が必要になる。
  4. SELECT ステートメントで取得する列指定に「*」は指定出来ないので、全ての列名を記述する必要がある。
  5. 内部でインデックス付きビューを使用しているときに、ビューのインデックスを有効にする為には、FROM句のテーブル指定に「WITH (NOEXPAND)」の指定が必要。
    … FROM Hoge AS H WITH (NOEXPAND) WHERE …

参考

SQL Server 2000 のインデックス付きビューによるパフォーマンスの向上
SQL Server 2005 インデックス付きビューによるパフォーマンスの向上

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*