Udostępnij za pośrednictwem


Tworzenie widoków indeksowanych

Widok muszą spełniać następujące wymagania, przed utworzeniem indeks klastrowany na niej:

  • Opcje ANSI_NULLS i QUOTED_IDENTIFIER muszą być zestaw on po instrukcja CREATE VIEW zostało wykonane.Funkcja OBJECTPROPERTY raportuje ten widoków przez ExecIsAnsiNullsOn lub ExecIsQuotedIdentOn właściwości.

  • Opcja ANSI_NULLS, muszą być zestaw on wykonywanie wszystkich instrukcji CREATE TABLE, tworzących tabele odwołuje widoku.

  • Widok nie musi odwołać innych widoków, tylko bazowy tabel.

  • Wszystkie tabele bazowe odwołuje widoku musi być w tej samej bazy danych jako widok i mają tego samego właściciela jako widok.

  • Musi zostać utworzony widok z opcją SCHEMABINDING.Powiązanie schematu wiąże widoku schematu z tabel podstawowych.

  • Funkcje zdefiniowane przez użytkownika w widoku musi być utworzony przy użyciu opcji SCHEMABINDING.

  • Tabele i funkcje zdefiniowane przez użytkownika musi odwoływać się dwóch części nazwy w widoku.Jedna część, trzech części i czteroczęściowym nazwy nie są dozwolone.

  • Wszystkie funkcje odwołuje się wyrażenie w widoku musi być deterministyczny.IsDeterministic raportów właściwość funkcji OBJECTPROPERTY czy firmy Deterministic Networks jest funkcja zdefiniowana przez użytkownika.Aby uzyskać więcej informacji, zobacz Przewidywalne i rodzaju funkcje.

    Ostrzeżenie

    Gdy odwołujesz się do datetime i smalldatetime ciąg literały w Widoki indeksowane w SQL Server 2008, firma Microsoft zaleca, aby jawnie przekonwertować literału typu data przy użyciu stylu format data deterministyczny.Lista stylów formatowania data są przewidywalne, zobacz CAST i CONVERT (Transact-SQL).Wyrażeniami niejawna konwersja ciągów znaków do datetime lub smalldatetime są uważane za rodzaju, chyba że poziom zgodności jest zestaw 80 lub starszej.Wynika to z wyniki zależy od ustawienia języka i format daty sesja serwera.Na przykład wyniki wyrażenie CONVERT (datetime, '30 listopad 1996', 113) zależą od ustawienia języka, ponieważ ciąg "listopad' oznacza miesiącami w różnych językach.Podobnie, w wyrażenie DATEADD(mm,3,'2000-12-01'), SQL Server interpretuje ciąg '2000-12-01' oparte na ustawienie format daty.

    Niejawna konwersja nie obsługujących kodu Unicode znaku danych między sortowania jest traktowana jako rodzaju, chyba że poziom zgodności jest zestaw 80 lub starszym.

    Tworzenie indeksów w widokach zawierających te wyrażenia nie jest dozwolone w trybie zgodności 90.Jednak powstawać są istniejące widoki zawierające te wyrażenia z uaktualnioną bazą danych.Jeśli używasz Widoki indeksowane, zawierające ciąg niejawna do konwersji data, być pewne, że ustawienia języka i format data są zgodne w bazach danych i aplikacje, aby uniknąć uszkodzenia możliwe indeksowany widok.

  • Jeśli używa definicji widoku funkcja agregująca, lista wyboru musi również zawierać COUNT_BIG (*).

  • Właściwość dostępu danych funkcja zdefiniowanej przez użytkownika musi być nr SQL i właściwość zewnętrzny dostęp musi być nr

  • Typowe funkcje runtime (CLR) języka mogą być wyświetlane na liście wybierz widok, ale nie może być częścią definicji klucz indeks klastrowany.Funkcje CLR nie może występować w klauzula WHERE, widoku lub klauzula ON operacji RIGHT JOIN w widoku.

  • Funkcje CLR i metod używanych w definicji widoku typy zdefiniowane przez użytkownika CLR musi mieć właściwości zestaw jak pokazano w poniższej tabela.

    Właściwość

    Uwaga:

    FIRMA DETERMINISTIC = TRUE

    Must be declared explicitly as an attribute of the Microsoft .NET Framework method

    DOKŁADNE = TRUE

    Muszą być zadeklarowane jawnie jako atrybut .NET Framework metoda.

    DOSTĘP DO DANYCH = NIE SQL

    Określone przez ustawienie DataAccess atrybut do DataAccessKind.None i SystemDataAccess atrybut do SystemDataAccessKind.None.

    ZEWNĘTRZNY DOSTĘP = NIE

    Domyślnie właściwość ta nie dla procedur CLR.

    Aby uzyskać więcej informacji dotyczących sposobu zestaw atrybuty CLR rutynowych metod, zobacz Atrybuty niestandardowe dla procedur CLR.

    PrzestrogaPrzestroga

    Nie zaleca się ustawienie właściwości CLR rutynowych metod w sprzeczności do funkcji metoda.W ten sposób doprowadzić do uszkodzenie danych.

  • Instrukcja SELECT w widoku nie może zawierać następujące Transact-SQL elementy składni:

    • The * or table_name**.*** składni, aby określić kolumny.Nazwy kolumn muszą być wyraźnie podane.

    • Nie można określić nazwę kolumna tabela jako proste wyrażenie w więcej niż jednej kolumna w widoku.kolumna można odwoływać się wielokrotnie dostarczone wszystkie lub wszystkich, ale jedno odwołanie do kolumna jest częścią wyrażenie złożone lub parametr do funkcja.Na przykład wybierz poniżej nie jest prawidłowa:

      SELECT ColumnA, ColumnB, ColumnA
      

      Ta lista wyboru jest prawidłowa:

      SELECT SUM(ColumnA) AS SumColA, ColumnA % ColumnB AS ModuloColAColB, COUNT_BIG(*) AS cBig FROM dbo.T1 GROUP BY ModuloColAColB
      
    • Wyrażenie w kolumna w klauzula GROUP BY lub wyrażenie wyniki wartość zagregowana.

    • tabela pochodnej.

    • Wspólne tabela wyrażenie (CTE).

    • Funkcje zestawu wierszy.

    • Unii, z wyjątkiem lub Operatorzy PRZECIĘCIE.

    • Podkwerendy.

    • Sprzężenia zewnętrzne lub samodzielnie.

    • klauzula TOP.

    • Klauzula ORDER BY.

    • Słowo kluczowe DISTINCT.

    • Liczba (dozwolone COUNT_BIG(*)).

    • Średnia, MAX, MIN, STDEV, STDEVP, VAR lub VARP wartość zagregowana funkcji.Jeśli AVG (expression) jest określony w kwerend odwołujących się do indeksowany widok, Optymalizator można często potrzebne wynik obliczyć Jeśli na liście wybierz widok zawiera sumy (expression) i COUNT_BIG (expression).Na przykład lista wyboru indeksowany widok nie może zawierać wyrażenie AVG(column1).Jeśli na liście wybierz widok zawiera wyrażenia SUM(column1) i COUNT_BIG(column1), SQL Server można obliczyć średnią dla kwerendy, która odwołuje się do widoku i określa AVG(column1).

    • Funkcja suma, która odwołuje się wyrażenie nullable.

    • Klauzula OVER, który zawiera klasyfikację lub wartość zagregowana funkcje okna.

    • CLR funkcja agregująca zdefiniowana przez użytkownika.

    • Predykaty pełnego tekstu ZAWIERA lub FREETEXT.

    • Klauzula komputerowe lub COMPUTE BY.

    • Operatorzy granic ZASTOSOWAĆ lub zewnętrzne.

    • Operatorzy PRZEGUBU lub UNPIVOT

    • Tabela wskazówek (dotyczy tylko poziom zgodności 90 lub wyższej).

    • Dołącz wskazówek.

    • Bezpośredniego odniesienia do wyrażenia Xquery.Dopuszczalne są odwołania do pośrednich, takich jak wyrażenia Xquery wewnątrz funkcja zdefiniowanej przez użytkownika związanych ze schematem.

  • Jeśli Grupuj według jest określony, widok Lista wyboru musi zawierać wyrażenie COUNT_BIG(*) i definicji widoku nie można określić HAVING, pakiet zbiorczy aktualizacji, modułu lub grupowanie zestawów.

Wymagania dotyczące instrukcji CREATE INDEX

Pierwszy indeks utworzony w widoku musi być unikatowy indeks klastrowany.Po unikatowego indeks klastrowany został utworzony, można utworzyć dodatkowe nieindeks klastrowanyes.Konwencje nazewnictwa dla indeksów w widokach są takie same, jak dla indeksów w tabelach.Jedyną różnicą jest to, że nazwa tabela jest zastępowana nazwą widoku.Aby uzyskać więcej informacji, zobacz CREATE INDEX (Transact-SQL).

Instrukcja CREATE INDEX muszą spełniać następujące wymagania, jak również wymagania regularne tworzenie INDEKSU:

  • Użytkownik wykonujący instrukcja CREATE INDEX musi być właściciela widoku.

  • Następujące zestaw opcje muszą być zestaw on podczas wykonywania instrukcja CREATE INDEX:

    • ANSI_NULLS

    • SPOWODOWAŁYBY

    • ANSI_WARNINGS

    • CONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIER

  • Opcja NUMERIC_ROUNDABORT musi być zestaw do OFF.Jest to ustawienie domyślne.

  • Jeśli baza danych jest uruchomiony w trybie zgodności 80 lub wcześniej, opcja ARITHABORT musi być zestaw on.

  • Podczas tworzenia klastra lub indeks nieklastrowany, należy ustawić opcję IGNORE_DUP_KEY OFF (zestaw domyślne).

  • Widok nie może zawierać text, ntext, lub image kolumny, nawet jeśli nie są one wywoływane w instrukcja CREATE INDEX.

  • Jeśli instrukcja SELECT w definicji klauzula GROUP BY, klucz unikatowy indeks klastrowany może odwoływać się tylko kolumny określone w klauzula GROUP BY.

  • Wyrażenie niedokładny stanowi wartość indeksu kolumna klucz musi odwoływać się przechowywane kolumna w tabela bazowa widoku podstawowej.Ta kolumna może być regularnych kolumny przechowywanej lub utrwalona kolumna obliczana.Inne wyrażenia niedokładny może być częścią klucz kolumna indeksowany widok.

Uwagi

Ustawienie large_value_types_out_of_row opcję kolumna w indeksowany widok jest dziedziczona z ustawienie odpowiedniej kolumna w tabela bazowa.Wartość ta jest zestaw za pomocą sp_tableoption.Ustawienie domyślne dla kolumn z wyrażeń jest 0.Oznacza to, że duża wartość typy są przechowywane w wierszu.Aby uzyskać więcej informacji, zobacz Duża wartość typów danych.

After the clustered index is created, any connection that tries to modify the base data for the view must also have the same option settings required to create the index.SQL Server generates an error and rolls back any INSERT, UPDATE, or DELETE statement that will affect the result set of the view if the connection executing the statement does not have the correct option settings.Aby uzyskać więcej informacji, zobacz Ustaw opcje, które wpływają na wyniki.

Wszystkie indeksy w widoku są usuwane, gdy widok jest odrzucany.Wszystkie zbudowania indeksów i statystyki tworzone automatycznie w widoku są usuwane po upuszczeniu indeks klastrowany.Statystyki tworzone przez użytkownika w widoku są zachowywane.Zbudowania indeksów można upuszczać indywidualnie.Upuszczanie indeks klastrowany w widoku usuwa zestaw wyników przechowywanych i Optymalizator zwraca do przetwarzania widoku, podobnie jak widok standardowy.

Chociaż kolumn tworzących indeks klastrowany klucz podano w instrukcja tworzenia UNIKATOWEGO INDEKSU KLASTROWANEGO, zestaw wyników pełny widok jest przechowywany w bazie danych.Zgodnie z indeksem klastrowanym dla tabela bazowej B-drzewo struktury indeks klastrowany zawiera tylko kolumny klucz, ale wiersze danych zawierają wszystkie kolumny zestaw wyników widoku.

Jeśli chcesz dodać indeksy do widoków w istniejącym systemie musi schematu powiązać dowolnego widoku, w którym chcesz umieścić indeksu.Można wykonywać następujące operacje:

  • Ponownie, określając Z SCHEMABINDING i upuść widoku.

  • Można utworzyć drugi widok, który ma ten sam tekst jako istniejącego widoku, ale pod inną nazwą.Optymalizator uważa indeksy w nowym widoku, nawet jeśli nie jest bezpośrednio wywoływane w klauzula FROM kwerendy.

    Ostrzeżenie

    Widoki lub tabele uczestniczące w widoku utworzone za pomocą klauzula SCHEMABINDING nie zostanie usunięty, chyba że widok jest usunięte lub zmienione tak, aby go nie ma już powiązanie schematu.Ponadto instrukcji ALTER TABLE na tabele uczestniczące w widokach mających powiązanie schematu zakończy się niepowodzeniem, jeśli instrukcje te mają wpływ na definicję widoku.

Należy upewnić się, że nowy widok spełnia wszystkie wymagania indeksowany widok.Może to wymagać zmienić właociciela widoku i wszystkich tabel bazowych odwołuje się więc one są wszystkie posiadane przez samego użytkownika.

Indeksy na tabele i widoki mogą być wyłączane.Po wyłączeniu indeks klastrowany w tabela indeksów dla widoków skojarzonych z tabela są również wyłączone.Aby uzyskać więcej informacji, zobacz Wyłączanie indeksów.

Przykład

Poniższy przykład tworzy widok i indeks tego widoku.Znajdują się dwie kwerendy, które używają indeksowany widok.

USE AdventureWorks2008R2;
GO
--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;
GO
--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;
GO