Tworzenie indeksów na kolumny obliczane

Kolumny obliczane można zdefiniować indeksy, o ile są spełnione następujące wymagania:

  • Wymagania dotyczące własności

  • Wymagania determinism

  • Wymagania dokładności

  • Wymagania dotyczące typu danych

  • Wymagania opcji zestaw

Wymagania dotyczące własności

Wszystkie odwołania do funkcja kolumna obliczana musi mieć tego samego właściciela jako tabela.

Wymagania dotyczące determinism

Wyrażenia są deterministyczny, jeśli zawsze zwraca ten sam wynik dla określonego zestaw danych wejściowych.The IsDeterministic właściwość of the COLUMNPROPERTY funkcja reports whether a computed_column_expression is deterministic.

  • The computed_column_expression must be deterministic.A computed_column_expression jest deterministyczny, gdy spełniony jest jeden lub więcej z następujących czynności:

    • Wszystkie funkcje, które odwołuje się wyrażenie to deterministyczny i dokładne.Funkcje te obejmują zarówno zdefiniowane przez użytkownika i funkcje wbudowane.Aby uzyskać więcej informacji zobaczDeterministic and Nondeterministic Functions.Funkcje mogą być nieprecyzyjne, jeśli kolumna obliczana jest ZACHOWYWANE.Aby uzyskać więcej informacji zobacz Tworzenie indeksów w utrwalonym kolumny obliczane w dalszej części tego tematu.

    • Wszystkie kolumny, do których istnieją odwołania w wyrażenie pochodzą z tabela zawierającej kolumna obliczana.

    • Odwołanie do kolumna nie pobiera dane z wielu wierszy.Na przykład funkcji agregujących, takich jak agregacja lub AVG zależy od danych z wielu wierszy i sprawdź czy computed_column_expression nondeterministic.

    • Nie ma dostępu do danych systemu lub dostępu do danych użytkownika.

  • Kolumna obliczana, zawierającej typowe wyrażenie czasu wykonywania (CLR) języka musi być deterministyczny i oznaczonych PERSISTED, zanim kolumny mogą być indeksowane.Środowisko CLR wyrażeń typ zdefiniowany przez użytkownika są dozwolone w definicji kolumna obliczana.Obliczona kolumn, których typ jest zdefiniowany przez użytkownika typ danych CLR mogą być indeksowane tak długo, jak typ jest porównywalne.Aby uzyskać więcej informacji zobaczŚrodowisko CLR Typy definiowane przez użytkownika.

Uwaga

Odwołań do data danych literały ciągów znaków typu w indeksowanych kolumnach obliczanych SQL Server, firma Microsoft zaleca, aby jawnie przekonwertować literał na typ data przy użyciu stylu format data deterministyczny. Aby uzyskać listę deterministyczny stylów formatowania data Zobacz CAST i CONVERT.Wyrażenia, które obejmują niejawna konwersja ciągów znaków do typów danych daty są traktowane jako nondeterministic, chyba że poziom zgodności bazy danych jest zestaw 80 lub wcześniej.Dzieje się tak, ponieważ zależą od wyniki JĘZYK and DATEFORMAT ustawienia sesja serwera.Na przykład wyniki wyrażenie CONVERT (datetime, '30 listopad 1996', 113) zależą od ustawienia języka, ponieważ ciąg "30 listopad 1996"oznacza miesiącami w różnych językach. Podobnie w wyrażeniu DATEADD(mm,3,'2000-12-01'), Database Engine interpretuje ciąg '2000-12-01' w zależności od ustawienia DATEFORMAT.

Niejawna konwersja nie obsługujących kodu Unicode znaku danych między sortowania jest również za nondeterministic, chyba że ustawiony jest poziom zgodności 80 lub wcześniej.

Gdy ustawienie poziom zgodności bazy danych jest 90, nie można utworzyć indeksy na kolumny obliczane, które zawierają te wyrażenia.Jednak maintainable są istniejące obliczanej kolumny, które zawierają te wyrażenia uaktualnionej bazy danych.Jeśli używasz indeksowanych obliczanej kolumny, które zawierają ciąg niejawna do konwersji data, aby uniknąć Indeks możliwego uszkodzenia, należy się upewnić, czy ustawienia LANGUAGE i DATEFORMAT w bazach danych i aplikacji.

Wymagania dotyczące dokładności

The computed_column_expression must be precise.A computed_column_expression jest dokładne, gdy spełniony jest jeden lub więcej z następujących czynności:

  • Nie jest wyrażenie float lub real typy danych.

  • Nie używa float lub real Typ danych w jego definicji. Na przykład w następującej instrukcja kolumna y jest int i deterministyczny, ale nie dokładne.

    CREATE TABLE t2 (a int, b int, c int, x float, 
       y AS CASE x 
             WHEN 0 THEN a 
             WHEN 1 THEN b 
             ELSE c 
          END)
    

Uwaga

Wszystkie float lub real wyrażenie jest uważana za nieprecyzyjne i nie może być kluczem indeks, float lub real Wyrażenie może być używany w widoku indeksowanym, ale nie jako klucz. Ta zasada obowiązuje także dla kolumny obliczanej.Funkcję, wyrażenie lub funkcja zdefiniowana przez użytkownika jest uważany za nieprecyzyjne, jeśli zawiera ona żadnych float lub real wyrażenia. Dotyczy to pól logicznych (porównań).

The IsPrecise właściwość of the COLUMNPROPERTY funkcja reports whether a computed_column_expression is precise.

Wymagania dotyczące typu danych

  • The computed_column_expression defined for the kolumna obliczana cannot evaluate to the text, ntext, or image data types.

  • Kolumny obliczane pochodne image, ntext, text, varchar(max), nvarchar(max), varbinary(max), a xml typy danych mogą być indeksowane tak długo, jak typ danych kolumna obliczana jest dopuszczalne jako kolumna kluczy indeksu.

  • Kolumny obliczane pochodne image, ntext, a text typy danych mogą być indeks nieklastrowany nonkey kolumn (włączone), tak długo, jak typ danych kolumna obliczana jest dopuszczalne jako niekluczowa kolumna indeksu.

Wymagania opcji zestaw

  • Opcja poziom połączeń ANSI_NULLS musi być zestaw on po wykonaniu instrukcja CREATE tabela lub ALTER tabela, definiujący kolumna obliczana.The OBJECTPROPERTY funkcja reports whether the option is on through the IsAnsiNullsOn właściwość.

  • Połączenia, na którym tworzony jest indeks, a wszystkie połączenia próby instrukcji INSERT, UPDATE lub DELETE, zmieniających się wartości w indeksie, muszą mieć sześć opcji zestaw ustawiona na ON i OFF jedną opcję.Optymalizator ignoruje indeksu kolumna obliczana do wszystkich instrukcja SELECT wykonywane przez połączenia z tymi samymi ustawieniami.

    • Opcja NUMERIC_ROUNDABORT należy ustawić na OFF, a ON należy ustawić następujące opcje:

    • ANSI_NULLS

    • ANSI_PADDING

    • ANSI_WARNINGS

    • ARITHABORT

    • CONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIER

    ting zestaw ANSI_WARNINGS do ON niejawnie zestaw s ARITHABORT on, gdy poziom zgodności bazy danych jest zestaw 90.Jeśli poziom zgodności bazy danych jest ustawiony na 80 lub wcześniej, opcja ARITHABORT musi jawnie ustawiona na ON.Aby uzyskać więcej informacji zobaczSET Options That Affect Results.

Tworzenie indeksów w utrwalonym kolumny obliczane

Aby utworzyć indeks, dla kolumna obliczana, który jest zdefiniowany za pomocą wyrażenie deterministyczny, ale nieprecyzyjne, jeśli kolumna jest oznaczona PERSISTED w instrukcja CREATE tabela lub ALTER tabela.Oznacza to, że Database Engine przechowuje obliczonych wartości w tabela i aktualizuje je po zaktualizowaniu innych kolumn, od których zależy kolumna obliczana. The Database Engine uses these persisted values when it creates an index on the kolumna, and when the index is referenced in a query. Ta opcja umożliwia utworzenie indeksu dla kolumna obliczana po Database Engine nie może udowodnić z dokładnością, czy funkcja, która zwraca obliczona kolumn wyrażeń, szczególnie funkcja środowiska CLR, która jest tworzona w .NET Framework, jest deterministyczny i dokładne.