Erstellen von indizierten SichtenCreate Indexed Views

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

In diesem Artikel wird beschrieben, wie Sie Indizes für eine Sicht erstellen.This article describes how to create indexes on a view. Der erste Index, der für eine Sicht erstellt wird, muss ein eindeutiger gruppierter Index sein.The first index created on a view must be a unique clustered index. Nachdem der eindeutige gruppierte Index erstellt wurde, können Sie weitere nicht gruppierte Indizes erstellen.After the unique clustered index has been created, you can create more nonclustered indexes. Das Erstellen eines eindeutigen gruppierten Indexes für eine Sicht verbessert die Abfrageleistung, da die Sicht wie eine Tabelle mit einem gruppierten Index in der Datenbank gespeichert wird.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. Der Abfrageoptimierer kann indizierte Sichten verwenden, um die Abfrageausführung zu beschleunigen.The query optimizer may use indexed views to speed up the query execution. Es ist nicht erforderlich, dass in der Abfrage auf die jeweilige Sicht verwiesen wird, damit der Optimierer diese Sicht als Ersatz berücksichtigt.The view does not have to be referenced in the query for the optimizer to consider that view for a substitution.

VorbereitungenBefore You Begin

Die folgenden Schritte sind zum Erstellen einer indizierten Sicht erforderlich und wichtig für eine erfolgreiche Implementierung der indizierten Sicht:The following steps are required to create an indexed view and are critical to the successful implementation of the indexed view:

  1. Stellen Sie sicher, dass die SET-Optionen für alle vorhandenen Tabellen korrekt sind, auf die in der Sicht verwiesen wird.Verify the SET options are correct for all existing tables that will be referenced in the view.
  2. Stellen Sie sicher, dass die SET-Optionen für die Sitzung richtig festgelegt sind, bevor Sie Tabellen und die Sicht erstellen.Verify that the SET options for the session are set correctly before you create any tables and the view.
  3. Stellen Sie sicher, dass die Sichtdefinition deterministisch ist.Verify that the view definition is deterministic.
  4. Erstellen Sie die Sicht mithilfe der Option WITH SCHEMABINDING.Create the view by using the WITH SCHEMABINDING option.
  5. Erstellen Sie den eindeutigen gruppierten Index für die Sicht.Create the unique clustered index on the view.

Wichtig

Wenn Sie DML1 für eine Tabelle ausführen, auf die durch eine große Anzahl von indizierten Sichten oder durch wenige, jedoch sehr komplexe indizierte Sichten verwiesen wird, müssen diese indizierten Sichten ebenfalls aktualisiert werden.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. Als Folge daraus kann die DML-Abfrageleistung erheblich beeinträchtigt werden. In einigen Fällen kann kein Abfrageplan erstellt werden.As a result, DML query performance can degrade significantly, or in some cases, a query plan cannot even be produced. Testen Sie Ihre DML-Abfragen in solchen Fällen, bevor Sie diese für die Produktion verwenden, analysieren Sie den Abfrageplan, und optimieren bzw. vereinfachen Sie die DML-Anweisung.In such scenarios, test your DML queries before production use, analyze the query plan and tune/simplify the DML statement.

1 Beispielsweise UPDATE-, DELETE- oder INSERT-Vorgänge1 Such as UPDATE, DELETE or INSERT operations.

Erforderliche SET-Optionen für indizierte SichtenRequired SET Options for Indexed Views

Das Auswerten desselben Ausdrucks kann im Datenbank-EngineDatabase Engine zu unterschiedlichen Ergebnissen führen, wenn bei der Ausführung der Abfrage unterschiedliche SET-Optionen aktiviert sind.Evaluating the same expression can produce different results in the Datenbank-EngineDatabase Engine when different SET options are active when the query is executed. Wenn die SET-Option CONCAT_NULL_YIELDS_NULL auf ON festgelegt ist, gibt beispielsweise der Ausdruck 'abc' + NULL den Wert NULL zurück.For example, after the SET option CONCAT_NULL_YIELDS_NULL is set to ON, the expression 'abc' + NULL returns the value NULL. Wenn die Option CONCAT_NULL_YIELDS_NULL allerdings auf OFF festgelegt ist, ergibt derselbe Ausdruck 'abc'.However, after CONCAT_NULL_YIELDS_NULL is set to OFF, the same expression produces 'abc'.

Um sicherzustellen, dass die Sichten ordnungsgemäß verwaltet werden können und konsistente Ergebnisse zurückgeben, sind für indizierte Sichten feste Werte für mehrere SET-Optionen erforderlich.To make sure that the views can be maintained correctly and return consistent results, indexed views require fixed values for several SET options. Die SET-Optionen in der folgenden Tabelle müssen auf die in der Spalte Erforderlicher Wert angezeigten Werte festgelegt werden, wenn eine der folgenden Bedingungen zutrifft:The SET options in the following table must be set to the values shown in the Required Value column whenever the following conditions occur:

  • Die Sicht und nachfolgende Indizes für die Sicht werden erstellt.The view and subsequent indexes on the view are created.
  • Die Basistabellen, auf die beim Erstellen der Ansicht in dieser verwiesen wird.The base tables referenced in the view at the time the view is created.
  • Für eine Tabelle, die Teil der indizierten Sicht ist, wird ein Einfüge-, Update- oder Löschvorgang durchgeführt.There is any insert, update, or delete operation performed on any table that participates in the indexed view. Dazu gehören Vorgänge wie Massenkopieren, Replikation und verteilte Abfragen.This requirement includes operations such as bulk copy, replication, and distributed queries.
  • Die indizierte Sicht wird vom Abfrageoptimierer verwendet, um den Abfrageplan zu erstellen.The indexed view is used by the query optimizer to produce the query plan.
SET-OptionenSET options Erforderlicher WertRequired value StandardserverwertDefault server value StandardDefault

OLE DB- und ODBC-WertOLE DB and ODBC value
StandardDefault

DB-Library-WertDB-Library value
ANSI_NULLSANSI_NULLS EINON EINON EINON OFFOFF
ANSI_PADDINGANSI_PADDING EINON EINON EINON OFFOFF
ANSI_WARNINGS1ANSI_WARNINGS1 EINON EINON EINON OFFOFF
ARITHABORTARITHABORT EINON EINON OFFOFF OFFOFF
CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL EINON EINON EINON OFFOFF
NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF OFFOFF OFFOFF OFFOFF
QUOTED_IDENTIFIERQUOTED_IDENTIFIER EINON EINON EINON OFFOFF
         

1 Durch das Festlegen von ANSI_WARNINGS auf ON wird ARITHABORT implizit auf ON festgelegt.1 Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON.

Wenn Sie eine OLE DB- oder ODBC-Serververbindung verwenden, müssen Sie nur den Wert der ARITHABORT-Einstellung ändern.If you are using an OLE DB or ODBC server connection, the only value that must be modified is the ARITHABORT setting. Alle DB-Library-Werte müssen entweder auf Serverebene mithilfe von sp_configure oder über die Anwendung mithilfe des SET-Befehls ordnungsgemäß festgelegt werden.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.

Wichtig

Es wird dringend empfohlen, die Benutzeroption ARITHABORT serverweit auf ON festzulegen, sobald in einer Datenbank auf dem Server die erste indizierte Sicht oder der erste Index für eine berechnete Spalte erstellt wird.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.

Deterministische SichtenDeterministic Views

Die Definition einer indizierten Sicht muss deterministisch sein.The definition of an indexed view must be deterministic. Eine Sicht ist deterministisch, wenn alle Ausdrücke in der Auswahlliste sowie die WHERE-Klausel und die GROUP BY-Klausel deterministisch sind.A view is deterministic if all expressions in the select list, as well as the WHERE and GROUP BY clauses, are deterministic. Deterministische Ausdrücke geben stets dasselbe Ergebnis zurück, wenn sie mit einer bestimmten Gruppe von Eingabewerten ausgewertet werden.Deterministic expressions always return the same result any time they are evaluated with a specific set of input values. Nur deterministische Funktionen können Teil von deterministischen Ausdrücken sein.Only deterministic functions can participate in deterministic expressions. Beispielsweise ist die DATEADD-Funktion deterministisch, weil sie für eine bestimmte Gruppe von Argumentwerten immer das gleiche Ergebnis für die drei Parameter zurückgibt.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 ist nicht deterministisch, da diese Funktion immer mit dem gleichen Argument aufgerufen wird, der zurückgegebene Wert jedoch bei jeder Ausführung unterschiedlich ist.GETDATE is not deterministic because it is always invoked with the same argument, but the value it returns changes each time it is executed.

Um zu bestimmen, ob eine Sichtspalte deterministisch ist, verwenden Sie die IsDeterministic -Eigenschaft der COLUMNPROPERTY -Funktion.To determine whether a view column is deterministic, use the IsDeterministic property of the COLUMNPROPERTY function. Mithilfe der IsPrecise-Eigenschaft der COLUMNPROPERTY-Funktion können Sie bestimmen, ob eine deterministische Spalte in einer Sicht mit Schemabindung präzise ist.To determine if a deterministic column in a view with schema binding is precise, use the IsPrecise property of the COLUMNPROPERTY function. COLUMNPROPERTY gibt den Wert 1 für TRUE, den Wert 0 für FALSE und NULL für ungültige Eingaben zurück.COLUMNPROPERTY returns 1 if TRUE, 0 if FALSE, and NULL for input that is not valid. Dies bedeutet, dass die Spalte nicht deterministisch oder nicht präzise ist.This means the column is not deterministic or not precise.

Auch wenn ein Ausdruck deterministisch ist, kann das exakte Ergebnis von der Prozessorarchitektur oder der Version des Microcodes abhängen, wenn dieser Ausdruck float-Ausdrücke enthält.Even if an expression is deterministic, if it contains float expressions, the exact result may depend on the processor architecture or version of microcode. Um die Datenintegrität sicherzustellen, können solche Ausdrücke nur als Nichtschlüsselspalten von indizierten Sichten verwendet werden.To ensure data integrity, such expressions can participate only as non-key columns of indexed views. Deterministische Ausdrücke, die keine float-Ausdrücke enthalten, werden als präzise bezeichnet.Deterministic expressions that do not contain float expressions are called precise. Nur präzise deterministische Ausdrücke können in indizierten Sichten Teile von Schlüsselspalten und WHERE- oder GROUP BY-Klauseln sein.Only precise deterministic expressions can participate in key columns and in WHERE or GROUP BY clauses of indexed views.

Zusätzliche AnforderungenAdditional Requirements

Zusätzlich zu den Anforderungen bzgl. SET-Optionen und deterministischen Funktionen müssen die folgenden Anforderungen erfüllt werden:In addition to the SET options and deterministic function requirements, the following requirements must be met:

  • Der Benutzer, der die CREATE INDEX-Anweisung ausführt, muss der Besitzer der Sicht sein.The user that executes CREATE INDEX must be the owner of the view.

  • Wenn Sie den Index erstellen, muss die Option IGNORE_DUP_KEY auf OFF (Standardeinstellung) festgelegt sein.When you create the index, the IGNORE_DUP_KEY option must be set to OFF (the default setting).

  • Auf Tabellen muss in der Sichtdefinition mit dem zweiteiligen Namen Schema . Tabellenname verwiesen werden.Tables must be referenced by two-part names, schema.tablename in the view definition.

  • Benutzerdefinierte Funktionen, auf die in der Sicht verwiesen wird, müssen mit der Option WITH SCHEMABINDING erstellt werden.User-defined functions referenced in the view must be created by using the WITH SCHEMABINDING option.

  • Auf benutzerdefinierte Funktionen, auf die in der Sicht verwiesen wird, muss mit zweiteiligen Namen verwiesen werden: <schema> . <function> .Any user-defined functions referenced in the view must be referenced by two-part names, <schema>.<function>.

  • Die Datenzugriffseigenschaft einer benutzerdefinierten Funktion muss NO SQL lauten, und die Eigenschaft für den externen Zugriff muss NO lauten.The data access property of a user-defined function must be NO SQL, and external access property must be NO.

  • CLR-Funktionen (Common Language Runtime) können in der SELECT-Liste der Sicht angezeigt werden, können aber nicht Teil der Definition des gruppierten Indexschlüssels sein.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-Funktionen können nicht in der WHERE-Klausel der Sicht oder in der ON-Klausel einer JOIN-Operation in der Sicht auftreten.CLR functions cannot appear in the WHERE clause of the view or the ON clause of a JOIN operation in the view.

  • Für CLR-Funktionen und -Methoden der CLR-benutzerdefinierten Typen, die in der Sichtdefinition verwendet werden, müssen die in der folgenden Tabelle dargestellten Eigenschaften festgelegt werden.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.

    EigenschaftProperty HinweisNote
    DETERMINISTIC = TRUEDETERMINISTIC = TRUE Muss explizit als ein Attribut der Microsoft .NET Framework-Methode deklariert werden.Must be declared explicitly as an attribute of the Microsoft .NET Framework method.
    PRECISE = TRUEPRECISE = TRUE Muss explizit als ein Attribut der .NET Framework-Methode deklariert werden.Must be declared explicitly as an attribute of the .NET Framework method.
    DATA ACCESS = NO SQLDATA ACCESS = NO SQL Wird durch Festlegen des DataAccess-Attributs auf DataAccessKind.None und des SystemDataAccess-Attributs auf SystemDataAccessKind.None bestimmt.Determined by setting DataAccess attribute to DataAccessKind.None and SystemDataAccess attribute to SystemDataAccessKind.None.
    EXTERNAL ACCESS = NOEXTERNAL ACCESS = NO Diese Eigenschaft ist für CLR-Routinen standardmäßig auf NO festgelegt.This property defaults to NO for CLR routines.
       
  • Die Sicht muss mithilfe der Option WITH SCHEMABINDING erstellt werden.The view must be created by using the WITH SCHEMABINDING option.

  • Die Sicht darf nur auf Basistabellen in derselben Datenbank wie die Sicht verweisen.The view must reference only base tables that are in the same database as the view. Die Sicht kann nicht auf andere Sichten verweisen.The view cannot reference other views.

  • Wenn GROUP BY vorhanden ist, muss die VIEW-Definition COUNT_BIG(*) enthalten, während HAVING nicht enthalten sein darf.If GROUP BY is present, the VIEW definition must contain COUNT_BIG(*) and must not contain HAVING. Diese GROUP BY-Einschränkungen gelten nur für die indizierte Sichtdefinition.These GROUP BY restrictions are applicable only to the indexed view definition. Im Ausführungsplan einer Abfrage kann eine indizierte Sicht auch dann verwendet werden, wenn sie diese GROUP BY-Einschränkungen nicht erfüllt.A query can use an indexed view in its execution plan even if it does not satisfy these GROUP BY restrictions.

  • Wenn die Sichtdefinition eine GROUP BY-Klausel enthält, kann der Schlüssel des eindeutigen gruppierten Indexes nur auf die Spalten verweisen, die in der GROUP BY-Klausel angegeben werden.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.

  • Die SELECT-Anweisung in der Sichtdefinition darf die folgenden Transact-SQL-Elemente nicht enthalten:The SELECT statement in the view definition must not contain the following Transact-SQL elements:

    Transact-SQL-ElementeTransact-SQL elements (Fortsetzung)(continued) (Fortsetzung)(continued)
    COUNT ROWSET-Funktionen (OPENDATASOURCE, OPENQUERY, OPENROWSET und OPENXML)ROWSET functions (OPENDATASOURCE, OPENQUERY, OPENROWSET, AND OPENXML) OUTER-Joins (LEFT, RIGHT oder FULL)OUTER joins (LEFT, RIGHT, or FULL)
    Abgeleitete Tabelle (durch Angabe einer SELECT-Anweisung in der FROM-Klausel definiert)Derived table (defined by specifying a SELECT statement in the FROM clause) SelbstjoinsSelf-joins Angeben von Spalten mithilfe von SELECT * oder SELECT <table_name>.*Specifying columns by using SELECT * or SELECT <table_name>.*
    DISTINCT STDEV, STDEVP, VAR, VARP oder AVGSTDEV, STDEVP, VAR, VARP, or AVG Allgemeine Tabellenausdrücke (CTE, Common Table Expression)Common table expression (CTE)
    float1-, text-, ntext-, image-, XML- oder filestream-Spaltenfloat1, text, ntext, image, XML, or filestream columns UnterabfrageSubquery Die OVER-Klausel, die Fensterrangfunktionen oder Fensteraggregatfunktionen enthältOVER clause, which includes ranking or aggregate window functions
    Volltextprädikate (CONTAINS, FREETEXT)Full-text predicates (CONTAINS, FREETEXT) Eine SUM-Funktion, die auf einen Ausdruck verweist, der NULL-Werte zulässtSUM function that references a nullable expression ORDER BY
    CLR-benutzerdefinierte AggregatfunktionCLR user-defined aggregate function TOP CUBE-, ROLLUP- oder GROUPING SETS-OperatorenCUBE, ROLLUP, or GROUPING SETS operators
    MIN, MAXMIN, MAX UNION-, EXCEPT- oder INTERSECT-OperatorenUNION, EXCEPT, or INTERSECT operators TABLESAMPLE
    TabellenvariablenTable variables OUTER APPLY oder CROSS APPLYOUTER APPLY or CROSS APPLY PIVOT, UNPIVOTPIVOT, UNPIVOT
    Spaltensätze mit geringer DichteSparse column sets Inline-Tabellenwertfunktionen (TVF) oder Tabellenwertfunktionen mit mehreren Anweisungen (MSTVF)Inline (TVF) or multi-statement table-valued functions (MSTVF) OFFSET
    CHECKSUM_AGG

    1 Die indizierte Sicht kann Spalten mit dem Datentyp float enthalten. Allerdings dürfen solche Spalten nicht im Schlüssel des gruppierten Indexes enthalten sein.1 The indexed view can contain float columns; however, such columns cannot be included in the clustered index key.

    Wichtig

    Indizierte Sichten, die temporale Abfragen (Abfragen, die die FOR SYSTEM_TIME-Klausel verwenden) überlagern, werden nicht unterstützt.Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause).

EmpfehlungenRecommendations

Wenn Sie in indizierten Sichten auf datetime - und smalldatetime -Zeichenfolgenliterale verweisen, wird empfohlen, das Literal mithilfe eines deterministischen Datenformats explizit in den gewünschten Datentyp zu konvertieren.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. Eine Liste der deterministischen Datenformatstile finden Sie unter CAST und CONVERT (Transact-SQL).For a list of the date format styles that are deterministic, see CAST and CONVERT (Transact-SQL). Weitere Informationen zu deterministischen und nicht deterministischen Ausdrücken finden Sie im Abschnitt Weitere Überlegungen auf dieser Seite.For more information about deterministic and nondeterministic expressions, see the Considerations section in this page.

Wenn Sie DML (z.B. UPDATE, DELETE oder INSERT) für eine Tabelle ausführen, auf die durch eine große Anzahl von indizierten Sichten oder durch wenige, jedoch sehr komplexe indizierte Sichten verwiesen wird, müssen diese indizierten Sichten während der DML-Ausführung ebenfalls aktualisiert werden.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. Als Folge daraus kann die DML-Abfrageleistung erheblich beeinträchtigt werden. In einigen Fällen kann kein Abfrageplan erstellt werden.As a result, DML query performance may degrade significantly, or in some cases, a query plan cannot even be produced. Testen Sie Ihre DML-Abfragen in solchen Fällen, bevor Sie diese für die Produktion verwenden, analysieren Sie den Abfrageplan, und optimieren bzw. vereinfachen Sie die DML-Anweisung.In such scenarios, test your DML queries before production use, analyze the query plan and tune/simplify the DML statement.

Weitere ÜberlegungenConsiderations

Die Einstellung der Option large_value_types_out_of_row der Spalten in einer indizierten Sicht wird von der Einstellung für die entsprechende Spalte in der Basistabelle vererbt.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. Dieser Wert wird mithilfe von sp_tableoptionfestgelegt.This value is set by using sp_tableoption. Die Standardeinstellung für Spalten, die auf Grundlage von Ausdrücken erstellt werden, ist 0.The default setting for columns formed from expressions is 0. Das bedeutet, dass umfangreiche Werte innerhalb der Zeile gespeichert werden.This means that large value types are stored in-row.

Indizierte Sichten können für eine partitionierte Tabelle erstellt werden und selbst partitioniert werden.Indexed views can be created on a partitioned table, and can themselves be partitioned.

Wenn Sie verhindern möchten, dass Datenbank-EngineDatabase Engine indizierte Sichten verwendet, schließen Sie den OPTION (EXPAND VIEWS)-Hinweis in die Abfrage ein.To prevent the Datenbank-EngineDatabase Engine from using indexed views, include the OPTION (EXPAND VIEWS) hint on the query. Außerdem kann der Optimierer die Indizes für die Sichten nicht verwenden, wenn eine der aufgeführten Optionen falsch festgelegt ist.Also, if any of the listed options are incorrectly set, this will prevent the optimizer from using the indexes on the views. Weitere Informationen zum OPTION (EXPAND VIEWS)-Hinweis finden Sie unter SELECT (Transact-SQL).For more information about the OPTION (EXPAND VIEWS) hint, see SELECT (Transact-SQL).

Wenn eine Sicht gelöscht wird, werden alle Indizes für diese Sicht gelöscht.All indexes on a view are dropped when the view is dropped. Wird der gruppierte Index einer Sicht gelöscht, werden alle nicht gruppierten Indizes und alle automatisch erstellten Statistiken der Sicht gelöscht.All nonclustered indexes and auto-created statistics on the view are dropped when the clustered index is dropped. Vom Benutzer erstellte Statistiken zur Sicht werden beibehalten.User-created statistics on the view are maintained. Nicht gruppierte Indizes können einzeln gelöscht werden.Nonclustered indexes can be individually dropped. Durch das Löschen des gruppierten Index der Sicht wird das gespeicherte Resultset entfernt, und der Optimierer verarbeitet die Sicht von nun an wieder wie eine Standardsicht.Dropping the clustered index on the view removes the stored result set, and the optimizer returns to processing the view like a standard view.

Indizes für Tabellen und Sichten können deaktiviert werden.Indexes on tables and views can be disabled. Wenn ein gruppierter Index für eine Tabelle deaktiviert wird, werden Indizes für die den Tabellen zugeordneten Sichten auch deaktiviert.When a clustered index on a table is disabled, indexes on views associated with the table are also disabled.

Ausdrücke, die eine implizite Konvertierung von Zeichenfolgen in datetime oder smalldatetime umfassen, werden als nicht deterministisch angesehen.Expressions that involve implicit conversion of character strings to datetime or smalldatetime are considered nondeterministic. Weitere Informationen finden Sie unter Nicht deterministische Konvertierung von Datumsliteralzeichenfolgen in DATE-Werte.For more information, see Nondeterministic conversion of literal date strings into DATE values.

SicherheitSecurity

BerechtigungenPermissions

Erfordert die CREATE VIEW-Berechtigung in der Datenbank und die ALTER-Berechtigung in dem Schema, in dem die Sicht erstellt wird.Requires CREATE VIEW permission in the database and ALTER permission on the schema in which the view is being created.

Verwenden von Transact-SQLUsing Transact-SQL

So erstellen Sie eine indizierte SichtTo create an indexed view

Im folgenden Beispiel werden eine Sicht und ein Index für diese Sicht erstellt.The following example creates a view and an index on that view. Dies beinhaltet zwei Abfragen, in denen die indizierte Sicht in der AdventureWorks-Datenbank verwendet wird.Two queries are included that use the indexed view in the AdventureWorks database.

--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
   QUOTED_IDENTIFIER, ANSI_NULLS ON;
--Create view with schemabinding.
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
   DROP VIEW Sales.vOrders ;
GO
CREATE VIEW Sales.vOrders
   WITH SCHEMABINDING
   AS  
      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;
GO
--Create an index on the view.
CREATE UNIQUE CLUSTERED INDEX IDX_V1
   ON Sales.vOrders (OrderDate, ProductID);
GO
--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
   ORDER BY Rev DESC;
GO
--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;

Weitere Informationen finden Sie unter CREATE VIEW (Transact-SQL).For more information, see CREATE VIEW (Transact-SQL).

Weitere InformationenSee Also