インデックス付きビューの作成Create Indexed Views

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database

この記事では、ビューにインデックスを作成する方法について説明します。This article describes how to create indexes on a view. ビューに作成する最初のインデックスは、一意なクラスター化インデックスにする必要があります。The first index created on a view must be a unique clustered index. 一意のクラスター化インデックスを作成した後は、非クラスター化インデックスを追加で作成できます。After the unique clustered index has been created, you can create more nonclustered indexes. ビューに一意のクラスター化インデックスを作成すると、そのビューは、クラスター化インデックスが定義されているテーブルと同じ方法でデータベースに格納されるので、クエリのパフォーマンスが向上します。Creating a unique clustered index on a view improves query performance because the view is stored in the database in the same way a table with a clustered index is stored. クエリ オプティマイザーではインデックス付きビューを使って、クエリの実行速度を高めることができます。The query optimizer may use indexed views to speed up the query execution. オプティマイザーでビューを代用するかどうかを判別するために、ビューがクエリで参照されている必要はありません。The view does not have to be referenced in the query for the optimizer to consider that view for a substitution.

はじめにBefore You Begin

次の手順は、インデックス付きビューの作成に必要な手順であり、インデックス付きビューの正常な実装に不可欠です。The following steps are required to create an indexed view and are critical to the successful implementation of the indexed view:

  1. SET オプションが、ビューで参照されるすべての既存のテーブルに対して正しいことを確認します。Verify the SET options are correct for all existing tables that will be referenced in the view.
  2. テーブルやビューを作成する前に、そのセッション用の SET オプションが正しく設定されていることを確認します。Verify that the SET options for the session are set correctly before you create any tables and the view.
  3. ビュー定義が決定的であることを確認します。Verify that the view definition is deterministic.
  4. ベース テーブルの所有者がビューと同じであることを確認します。Verify that the base table has the same owner as the view.
  5. WITH SCHEMABINDING オプションを使用して、ビューを作成します。Create the view by using the WITH SCHEMABINDING option.
  6. ビューに一意のクラスター化インデックスを作成します。Create the unique clustered index on the view.


多数のインデックス付きビュー、または少数ではあるものの非常に複雑なインデックス付きビューで参照されるテーブルに対して DML1 を実行する場合、これらの参照されるインデックス付きビューを更新する必要もあります。When executing DML1 on a table referenced by a large number of indexed views, or fewer but very complex indexed views, those referenced indexed views will have to be updated as well. その結果、DML クエリのパフォーマンスが大幅に低下する場合があります。また、場合によっては、クエリ プランを生成できないこともあります。As a result, DML query performance can degrade significantly, or in some cases, a query plan cannot even be produced. このようなシナリオでは、運用環境で使用する前に DML クエリをテストし、クエリ プランを分析してから DML ステートメントを調整/簡素化します。In such scenarios, test your DML queries before production use, analyze the query plan and tune/simplify the DML statement.

1 更新、削除、挿入操作など。1 Such as UPDATE, DELETE or INSERT operations.

インデックス付きビューに必要な SET オプションRequired SET Options for Indexed Views

クエリの実行時、異なる SET オプションがアクティブになっている場合、 データベース エンジンDatabase Engine は同じ式を評価しても異なる結果を生成することがあります。Evaluating the same expression can produce different results in the データベース エンジンDatabase Engine when different SET options are active when the query is executed. たとえば、SET のオプション CONCAT_NULL_YIELDS_NULL を ON に設定すると、式 'abc' + NULL は値 NULL を返すようになります。For example, after the SET option CONCAT_NULL_YIELDS_NULL is set to ON, the expression 'abc' + NULL returns the value NULL. 一方、CONCAT_NULL_YIELDS_NULL を OFF に設定すると、同じ式を実行が 'abc' を生成するようになります。However, after CONCAT_NULL_YIELDS_NULL is set to OFF, the same expression produces 'abc'.

ビューが正しく維持され、一貫性のある結果が返されるようにするには、インデックス付きビューで、いくつかの SET オプションに固定値が必要となります。To make sure that the views can be maintained correctly and return consistent results, indexed views require fixed values for several SET options. 固定値の設定が必要な SET オプションと、その値 ( 必要な値 の列を参照) を下の表に示します。この設定は次の条件に該当する場合に常に必要となります:The SET options in the following table must be set to the values shown in the Required Value column whenever the following conditions occur:

  • ビューが作成され、そのビューのインデックスも作成されている。The view and subsequent indexes on the view are created.
  • ビューの作成時にビューで参照されるベース テーブル。The base tables referenced in the view at the time the view is created.
  • インデックス付きビューに関与するテーブルで実行される挿入、更新、または削除操作がある。There is any insert, update, or delete operation performed on any table that participates in the indexed view. この要件には一括コピー、レプリケーション、分散クエリなどの操作も含まれます。This requirement includes operations such as bulk copy, replication, and distributed queries.
  • クエリ オプティマイザーで、クエリ プランの生成にインデックス付きビューが使用される。The indexed view is used by the query optimizer to produce the query plan.
SET オプションSET options 必須値Required value 既定のサーバー値Default server value DefaultDefault

OLE DB および ODBC 値OLE DB and ODBC value

DB-Library 値DB-Library value

1ANSI_WARNINGS を ON に設定すると、暗黙的に ARITHABORT が ON に設定されます。1 Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON.

OLE DB または ODBC サーバー接続を使用している場合、変更する必要があるのは ARITHABORT 設定の値だけです。If you are using an OLE DB or ODBC server connection, the only value that must be modified is the ARITHABORT setting. すべての DB-Library 値は、サーバー レベルで sp_configure を使用するか、アプリケーションから SET コマンドを使用して、正しく設定する必要があります。All DB-Library values must be set correctly either at the server level by using sp_configure or from the application by using the SET command.


ARITHABORT ユーザー オプションは、そのサーバーのデータベースで初めてインデックス付きビューまたは計算列のインデックスが作成されたときすぐに、サーバー全体で ON に設定することを強くお勧めします。We strongly recommend that you set the ARITHABORT user option to ON server-wide as soon as the first indexed view or index on a computed column is created in any database on the server.

決定的なビューDeterministic Views

インデックス付きビューの定義は決定的である必要があります。The definition of an indexed view must be deterministic. 選択リストのすべての式と、WHERE 句および GROUP BY 句が決定的である場合、ビューは決定的であるといえます。A view is deterministic if all expressions in the select list, as well as the WHERE and GROUP BY clauses, are deterministic. 決定的な式では、特定の入力値セットで評価するとき常に同じ結果が返されます。Deterministic expressions always return the same result any time they are evaluated with a specific set of input values. 決定的な式には、決定的な関数のみを含めることができます。Only deterministic functions can participate in deterministic expressions. たとえば、DATEADD 関数は、3 つのパラメーターの任意の引数値セットに対して常に同じ結果を返すため、決定的であるといえます。For example, the DATEADD function is deterministic because it always returns the same result for any given set of argument values for its three parameters. GETDATE は、常に同じ引数で起動されるにもかかわらず、返す値は実行のたびに変化するため、非決定的であるといえます。GETDATE is not deterministic because it is always invoked with the same argument, but the value it returns changes each time it is executed.

ビュー列が決定的かどうかを判断するには、 COLUMNPROPERTY 関数の IsDeterministic プロパティを使用します。To determine whether a view column is deterministic, use the IsDeterministic property of the COLUMNPROPERTY function. スキーマ バインドを含むビューの決定的な列が正確であるかどうかを判断するには、COLUMNPROPERTY 関数の IsPrecise プロパティを使います。To determine if a deterministic column in a view with schema binding is precise, use the IsPrecise property of the COLUMNPROPERTY function. COLUMNPROPERTY は、TRUE の場合は 1、FALSE の場合は 0、有効でない入力に対しては NULL を返します。COLUMNPROPERTY returns 1 if TRUE, 0 if FALSE, and NULL for input that is not valid. これは、列が決定的でないか、正確でないことを表します。This means the column is not deterministic or not precise.

式が決定的でも、浮動小数点式が含まれる場合は、正確な結果はプロセッサのアーキテクチャまたはマイクロコードのバージョンによって異なる可能性があります。Even if an expression is deterministic, if it contains float expressions, the exact result may depend on the processor architecture or version of microcode. データの整合性を確保するため、このような式は、インデックス付きビューの非キー列としてのみ含めることができます。To ensure data integrity, such expressions can participate only as non-key columns of indexed views. 浮動小数点式を含まない決定的な式は、正確な式です。Deterministic expressions that do not contain float expressions are called precise. インデックス ビューのキー列と WHERE または GROUP BY 句には、正確で決定的な式だけを含めることができます。Only precise deterministic expressions can participate in key columns and in WHERE or GROUP BY clauses of indexed views.

その他の要件Additional Requirements

SET オプションと決定的な関数の要件に加えて、次の要件を満たす必要があります。In addition to the SET options and deterministic function requirements, the following requirements must be met:

  • CREATE INDEX を実行するユーザーが、ビューの所有者である必要があります。The user that executes CREATE INDEX must be the owner of the view.

  • インデックスを作成する場合は、IGNORE_DUP_KEY オプションを OFF に設定する必要があります (既定の設定)。When you create the index, the IGNORE_DUP_KEY option must be set to OFF (the default setting).

  • ビュー定義では、 schema . tablename という 2 つの部分から構成される名前でテーブルが参照されていること。Tables must be referenced by two-part names, schema.tablename in the view definition.

  • ビューで参照されるユーザー定義関数は、WITH SCHEMABINDING オプションを使用して作成する必要があります。User-defined functions referenced in the view must be created by using the WITH SCHEMABINDING option.

  • ビューで参照されるユーザー定義関数は、2 つの部分で構成されている名前 ( <schema> . <function> ) で参照される必要があります。Any user-defined functions referenced in the view must be referenced by two-part names, <schema>.<function>.

  • ユーザー定義関数のデータ アクセス プロパティが NO SQL で、外部アクセス プロパティが NO である必要があります。The data access property of a user-defined function must be NO SQL, and external access property must be NO.

  • 共通言語ランタイム (CLR) 関数をビューの選択リストに使用することはできますが、クラスター化インデックス キーの定義に含めることはできません。Common language runtime (CLR) functions can appear in the select list of the view, but cannot be part of the definition of the clustered index key. CLR 関数は、ビューの WHERE 句や、ビューの JOIN 操作の ON 句では使用できません。CLR functions cannot appear in the WHERE clause of the view or the ON clause of a JOIN operation in the view.

  • ビュー定義で使用する CLR ユーザー定義型の CLR 関数やメソッドは、次の表のようにプロパティが設定されている必要があります。CLR functions and methods of CLR user-defined types used in the view definition must have the properties set as shown in the following table.

    プロパティProperty NoteNote
    DETERMINISTIC = TRUEDETERMINISTIC = TRUE Microsoft .NET Framework メソッドの属性として、明示的に宣言する必要があります。Must be declared explicitly as an attribute of the Microsoft .NET Framework method.
    PRECISE = TRUEPRECISE = TRUE .NET Framework メソッドの属性として、明示的に宣言する必要があります。Must be declared explicitly as an attribute of the .NET Framework method.
    DATA ACCESS = NO SQLDATA ACCESS = NO SQL DataAccess 属性を DataAccessKind.None に、SystemDataAccess 属性を SystemDataAccessKind.None に設定することで決定されます。Determined by setting DataAccess attribute to DataAccessKind.None and SystemDataAccess attribute to SystemDataAccessKind.None.
    EXTERNAL ACCESS = NOEXTERNAL ACCESS = NO CLR ルーチンの場合は、このプロパティの既定値は NO です。This property defaults to NO for CLR routines.
  • ビューは、WITH SCHEMABINDING オプションを使用して作成する必要があります。The view must be created by using the WITH SCHEMABINDING option.

  • ビューが、ビューと同じデータベース内のベース テーブルのみを参照していること。The view must reference only base tables that are in the same database as the view. ビューでは、他のビューを参照できません。The view cannot reference other views.

  • GROUP BY が存在する場合、VIEW 定義には COUNT_BIG(*) を含める必要があります。HAVING を含めることはできません。If GROUP BY is present, the VIEW definition must contain COUNT_BIG(*) and must not contain HAVING. このような GROUP BY 制限は、インデックス付きビュー定義にのみ適用されます。These GROUP BY restrictions are applicable only to the indexed view definition. クエリがこの GROUP BY 制限を満たしていない場合でも、実行プランでインデックス付きビューを使用することはできます。A query can use an indexed view in its execution plan even if it does not satisfy these GROUP BY restrictions.

  • ビュー定義に GROUP BY 句が含まれている場合、一意のクラスター化インデックスのキーでは、GROUP BY 句で指定した列のみを参照できます。If the view definition contains a GROUP BY clause, the key of the unique clustered index can reference only the columns specified in the GROUP BY clause.

  • ビュー定義の SELECT ステートメントには、次の Transact-SQL 要素を使用できません。The SELECT statement in the view definition must not contain the following Transact-SQL elements:

    Transact-SQL の要素Transact-SQL elements (続き)(continued) (続き)(continued)
    派生テーブル (FROM 句で SELECT ステートメントを指定することで定義される)Derived table (defined by specifying a SELECT statement in the FROM clause) 自己結合Self-joins SELECT * または SELECT <table_name>.* を使用して列を指定Specifying columns by using SELECT * or SELECT <table_name>.*
    DISTINCT STDEVSTDEVPVARVARP、または AVGSTDEV, STDEVP, VAR, VARP, or AVG 共通テーブル式 (CTE)Common table expression (CTE)
    float1textntextimageXML、または filestream の列float1, text, ntext, image, XML, or filestream columns サブクエリSubquery 順位付け関数または集計関数が含まれている OVEROVER clause, which includes ranking or aggregate window functions
    フルテキスト述語 (CONTAINSFREETEXT)Full-text predicates (CONTAINS, FREETEXT) NULL 値を許容する式を参照する SUM 関数SUM function that references a nullable expression ORDER BY
    CLR ユーザー定義集計関数CLR user-defined aggregate function TOP CUBEROLLUP、または GROUPING SETS の演算子CUBE, ROLLUP, or GROUPING SETS operators
    スパース列セットSparse column sets インライン (TVF) または複数ステートメントのテーブル値関数 (MSTVF)Inline (TVF) or multi-statement table-valued functions (MSTVF) OFFSET

    1 インデックス付きビューには float 列を含めることができますが、このような列はクラスター化インデックス キーには含めることができません。1 The indexed view can contain float columns; however, such columns cannot be included in the clustered index key.


    テンポラル クエリ (FOR SYSTEM_TIME 句を使うクエリ) 上では、インデックス付きビューはサポートされていません。Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause).


インデックス付きビューで datetime 文字リテラルと smalldatetime 文字列リテラルを参照するときは、決定的な日付形式スタイルを使用して、そのリテラルを目的の日付型に明示的に変換することをお勧めします。When you refer to datetime and smalldatetime string literals in indexed views, we recommend that you explicitly convert the literal to the date type you want by using a deterministic date format style. 決定的な日付形式の一覧については、「CAST および CONVERT (Transact-SQL)」を参照してください。For a list of the date format styles that are deterministic, see CAST and CONVERT (Transact-SQL). 決定的な式と非決定的な式の詳細については、このページの「考慮事項」セクションを参照してください。For more information about deterministic and nondeterministic expressions, see the Considerations section in this page.

多数のインデックス付きビュー、または少数ではあるものの非常に複雑なインデックス付きビューで参照されるテーブルに対して DML (UPDATEDELETEINSERT など) を実行する場合、DML 実行時にこれらのインデックス付きビューを更新する必要もあります。When you execute DML (such as UPDATE, DELETE or INSERT) on a table referenced by a large number of indexed views, or fewer but very complex indexed views, those indexed views will have to be updated as well during DML execution. その結果、DML クエリのパフォーマンスが大幅に低下する場合があります。また、場合によっては、クエリ プランを生成できないこともあります。As a result, DML query performance may degrade significantly, or in some cases, a query plan cannot even be produced. このようなシナリオでは、運用環境で使用する前に DML クエリをテストし、クエリ プランを分析してから DML ステートメントを調整/簡素化します。In such scenarios, test your DML queries before production use, analyze the query plan and tune/simplify the DML statement.


インデックス付きビューの列の large_value_types_out_of_row オプションの設定は、ベース テーブルの対応する列の設定が継承されます。The setting of the large_value_types_out_of_row option of columns in an indexed view is inherited from the setting of the corresponding column in the base table. この値は、 sp_tableoptionを使用して設定します。This value is set by using sp_tableoption. 式から形成される列に対する既定の設定は 0 です。The default setting for columns formed from expressions is 0. つまり、大きい値の型は行内に格納されます。This means that large value types are stored in-row.

インデックス付きビューはパーティション分割されたテーブルに作成でき、インデックス付きビュー自体をパーティション分割できます。Indexed views can be created on a partitioned table, and can themselves be partitioned.

データベース エンジンDatabase Engine でインデックス付きビューが使用されないようにするには、クエリに OPTION (EXPAND VIEWS) ヒントを含めます。To prevent the データベース エンジンDatabase Engine from using indexed views, include the OPTION (EXPAND VIEWS) hint on the query. これによって、オプションの 1 つが正しく設定されていない場合、オプティマイザーもビューのインデックスを使用できません。Also, if any of the listed options are incorrectly set, this will prevent the optimizer from using the indexes on the views. OPTION (EXPAND VIEWS) ヒントの詳細については、「SELECT (Transact-SQL)」を参照してください。For more information about the OPTION (EXPAND VIEWS) hint, see SELECT (Transact-SQL).

ビューが削除されると、ビューのすべてのインデックスも削除されます。All indexes on a view are dropped when the view is dropped. クラスター化インデックスが削除されると、ビューのすべての非クラスター化インデックスと自動的に作成された統計も削除されます。All nonclustered indexes and auto-created statistics on the view are dropped when the clustered index is dropped. ユーザーが作成したビューの統計は、保持されます。User-created statistics on the view are maintained. 非クラスター化インデックスは、個別に削除できます。Nonclustered indexes can be individually dropped. ビュー上のクラスター化インデックスを削除すると、格納された結果セットも削除され、オプティマイザーは、ビューの処理を標準的なビューと同様の処理に戻します。Dropping the clustered index on the view removes the stored result set, and the optimizer returns to processing the view like a standard view.

テーブルとビューのインデックスは無効にされる可能性があります。Indexes on tables and views can be disabled. テーブルのクラスター化インデックスが無効になると、そのテーブルに関連するビューのインデックスも無効になります。When a clustered index on a table is disabled, indexes on views associated with the table are also disabled.

datetime 型または smalldatetime 型への文字列の暗黙的な変換が必要な式は非決定的であると見なされます。Expressions that involve implicit conversion of character strings to datetime or smalldatetime are considered nondeterministic. 詳細については、「リテラル日付文字列を DATE 値に非決定論的に変換する」を参照してください。For more information, see Nondeterministic conversion of literal date strings into DATE values.



ビューを作成するには、データベースの CREATE VIEW アクセス許可と、ビューが作成されているスキーマの ALTER アクセス許可が必要です。To create the view, a user needs to hold the CREATE VIEW permission in the database and ALTER permission on the schema in which the view is being created. ベース テーブルが別のスキーマ内に存在する場合、少なくともそのテーブルに対する REFERENCES アクセス許可が必要です。If the base table resides within a different schema, the REFERENCES permission on the table is required as a minimum. インデックスを作成するユーザーとビューを作成したユーザーが異なる場合は、インデックスを作成するときに、ビューに対する ALTER アクセス許可が必要です (スキーマの ALTER によって処理されます)。If the User creating the Index differs from the Users who created the View, for the Index creation alone the ALTER-permission on the View is required (covered by ALTER on the schema).


インデックスは、所有者が参照先のテーブルと同じビューにのみ作成できます。Indexes can only be created on views which have the same owner as the referenced table or tables. これは、ビューとテーブル間の完全な 所有権の継承 とも呼ばれます。This is also called an intact ownership-chain between the view and the table(s). 通常、テーブルとビューが同じスキーマ内に存在する場合、そのスキーマ内のすべてのオブジェクトに同じスキーマの所有者が適用されます。Typically, when table and view reside within the same schema, the same schema-owner applies to all objects within the schema. つまり、そのビューの所有者にならずに、ビューを作成することが可能です。Therefore its possible to create a view and not be the owner of the view. これに対し、スキーマ内の個別のオブジェクトの所有者を明示的に別にすることも可能です。On the other hand is also possible that individual objects within a schema have different explicit owners. 所有者がスキーマの所有者と異なる場合、sys.tables の列 principal_id に値が格納されます。The column principal_id in sys.tables contains a value if the owner is different from the schema-owner.

Transact-SQL の使用Using Transact-SQL

インデックス付きビューを作成するにはTo create an indexed view

次の例では、ビューとそのビューのインデックスを作成します。The following example creates a view and an index on that view. AdventureWorks データベースでインデックス付きビューを使用する 2 つのクエリが含まれています。Two queries are included that use the indexed view in the AdventureWorks database.

--Set the options to support indexed views.
--Create view with schemabinding.
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
   DROP VIEW Sales.vOrders ;
CREATE VIEW Sales.vOrders
      SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue,
         OrderDate, ProductID, COUNT_BIG(*) AS COUNT
      FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
      WHERE od.SalesOrderID = o.SalesOrderID
      GROUP BY OrderDate, ProductID;
--Create an index on the view.
   ON Sales.vOrders (OrderDate, ProductID);
--This query can use the indexed view even though the view is
--not specified in the FROM clause.
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev,
   OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
JOIN Sales.SalesOrderHeader AS o
   ON od.SalesOrderID=o.SalesOrderID
      AND ProductID BETWEEN 700 and 800
      AND OrderDate >= CONVERT(datetime,'05/01/2002',101)
   GROUP BY OrderDate, ProductID
--This query can use the above indexed view.
SELECT OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
JOIN Sales.SalesOrderHeader AS o
   ON od.SalesOrderID=o.SalesOrderID
      AND DATEPART(mm,OrderDate)= 3
      AND DATEPART(yy,OrderDate) = 2002
    GROUP BY OrderDate
    ORDER BY OrderDate ASC;

詳細については、「CREATE VIEW (Transact-SQL)」を参照してください。For more information, see CREATE VIEW (Transact-SQL).

参照See Also