Udostępnij za pomocą


Indeksy dla kolumn obliczanych

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Indeksy dla obliczonych kolumn można zdefiniować, o ile spełnione są następujące wymagania:

  • Wymagania dotyczące własności
  • Wymagania dotyczące determinizmu
  • Wymagania dotyczące precyzji
  • Wymagania dotyczące typu danych
  • USTAWIANIE wymagań dotyczących opcji

Uwaga / Notatka

SET QUOTED_IDENTIFIER musi być ON podczas tworzenia lub zmieniania indeksów na kolumnach obliczeniowych lub w widokach indeksowanych. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER (Transact-SQL).

Wymagania dotyczące własności

Wszystkie odwołania do funkcji w obliczonej kolumnie muszą mieć tego samego właściciela co tabela.

Wymagania dotyczące determinizmu

Wyrażenia są deterministyczne, jeśli zawsze zwracają ten sam wynik dla określonego zestawu danych wejściowych. Właściwość IsDeterministic funkcji COLUMNPROPERTY zgłasza, czy computed_column_expression jest deterministyczny.

Computed_column_expression musi być deterministyczny. Computed_column_expression jest deterministyczny, gdy spełnione są wszystkie następujące kwestie:

  • Wszystkie funkcje, do których odwołuje się wyrażenie, są deterministyczne i precyzyjne. Te funkcje obejmują zarówno funkcje zdefiniowane przez użytkownika, jak i wbudowane. Aby uzyskać więcej informacji, zobacz Funkcje deterministyczne i niedeterministyczne. Funkcje mogą być nieprecyzyjne, jeśli obliczona kolumna to PERSISTED. Aby uzyskać więcej informacji, zobacz Create indexes on persistd computed columns late in this article (Tworzenie indeksów dla utrwanych kolumn obliczeniowych pod koniec tego artykułu).

  • Wszystkie kolumny, do których odwołuje się wyrażenie, pochodzą z tabeli zawierającej obliczoną kolumnę.

  • Odwołanie do kolumny nie odnosi się do danych z wielu wierszy. Na przykład funkcje agregujące, takie jak SUM lub AVG, które zależą od danych z wielu wierszy, sprawią, że computed_column_expression będzie niedeterministyczne.

  • Computed_column_expression nie ma dostępu do danych systemowych ani dostępu do danych użytkownika.

Każda obliczona kolumna zawierająca wyrażenie środowiska uruchomieniowego języka wspólnego (CLR) musi być deterministyczna i oznaczona PERSISTED przed indeksowaniem kolumny. Wyrażenia typu zdefiniowane przez użytkownika środowiska CLR są dozwolone w definicjach kolumn obliczeniowych. Obliczone kolumny, których typ jest typem zdefiniowanym przez użytkownika CLR, można indeksować tak długo, jak typ jest porównywalny. Aby uzyskać więcej informacji, zobacz CLR User-Defined Types (Typy User-Defined CLR).

RZUTOWANIE i KONWERTOWANIE

Jeśli odwołujesz się do ciągów znaków reprezentujących typ danych daty w indeksowanych kolumnach obliczonych w programie SQL Server, zalecamy jawne przekształcenie literału na typ daty, którego chcesz używać, stosując deterministyczny styl formatu daty. Aby uzyskać listę stylów formatu daty, które są deterministyczne, zobacz CAST i CONVERT.

Aby uzyskać więcej informacji, zobacz Niedeterministyczna konwersja ciągów znaków przedstawiających daty na wartości DATE.

Poziom zgodności

Niejawna konwersja danych znaków innych niż Unicode między sortowaniami jest uznawana za nieokreśloną, chyba że poziom zgodności jest ustawiony na 80 lub wcześniejszy.

Jeśli ustawienie poziomu zgodności bazy danych to 90, nie można tworzyć indeksów dla obliczonych kolumn zawierających te wyrażenia. Jednak istniejące obliczone kolumny zawierające te wyrażenia z uaktualnionej bazy danych są możliwe do utrzymania. Jeśli używasz indeksowanych kolumn obliczeniowych, które zawierają niejawne konwersje ciągów na daty, aby uniknąć możliwego uszkodzenia indeksu, upewnij się, że parametry LANGUAGE i DATEFORMAT są zgodne w twoich bazach danych i aplikacjach.

Poziom zgodności odpowiada programowi 90 SQL Server 2005 (9.x).

Wymagania dotyczące precyzji

computed_column_expression musi być precyzyjne. Computed_column_expression jest precyzyjny, gdy spełniony jest co najmniej jeden z następujących warunków:

  • Nie jest to wyrażenie typów danych zmiennoprzecinkowych ani rzeczywistych .

  • W definicji nie jest używany typ danych float ani real. Na przykład w poniższej instrukcji kolumna y jest int i deterministyczna, ale nie jest dokładna.

    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 / Notatka

Każde wyrażenie zmiennoprzecinkowe lub rzeczywiste jest uznawane za nieprecyzyjne i nie może być kluczem indeksu; wyrażenie zmiennoprzecinkowe lub rzeczywiste może być używane w widoku indeksowanym, ale nie jako klucz. Dotyczy to również kolumn obliczeniowych. Każda funkcja, wyrażenie lub funkcja zdefiniowana przez użytkownika jest uważana za niedokładną, jeśli zawiera jakiekolwiek wyrażenia zmiennoprzecinkowe lub rzeczywiste. Obejmuje to te logiczne (porównania).

Właściwość funkcji IsPreciseCOLUMNPROPERTY informuje, czy wyrażenie computed_column_expression jest precyzyjne.

Wymagania dotyczące typu danych

  • Computed_column_expression zdefiniowana dla obliczonej kolumny nie może ocenić typów danych tekstowych, ntekstowych ani obrazów.
  • Obliczone kolumny pochodzące z obrazu, ntextu, tekstu, varchar(max), nvarchar(max), varbinary(max)i typów danych XML mogą być indeksowane tak długo, jak typ danych obliczonej kolumny jest dozwolony jako kolumna klucza indeksu.
  • Obliczone kolumny pochodzące z typów danych obrazów, ntekstów i tekstowych mogą być kolumnami niekluczowymi (dołączonymi) w indeksie nieklastrowanym, o ile typ danych kolumny obliczeniowej jest dozwolony jako kolumna indeksu innego niż klucz.

USTAWIANIE wymagań dotyczących opcji

  • ANSI_NULLS Opcja na poziomie połączenia musi być ustawiona na ON gdy wykonywana jest instrukcja CREATE TABLE lub ALTER TABLE definiująca obliczoną kolumnę. Funkcja OBJECTPROPERTY zgłasza, czy opcja jest włączona poprzez właściwość IsAnsiNullsOn.

  • Połączenie, na którym jest tworzony indeks, oraz wszystkie połączenia próbujące instrukcje INSERT, UPDATE lub DELETE, które zmienią wartości w indeksie, muszą mieć sześć opcji SET ustawionych na ON i jedną opcję ustawioną na OFF. Optymalizator ignoruje indeks w obliczonej kolumnie dla dowolnej SELECT instrukcji wykonywanej przez połączenie, które nie ma takich samych ustawień opcji.

    Opcja NUMERIC_ROUNDABORT musi być ustawiona na OFF, a następujące opcje muszą zostać ustawione na ON:

    • ANSI_NULLS
    • ANSI_PADDING
    • ANSI_WARNINGS
    • ARITHABORT
    • CONCAT_NULL_YIELDS_NULL
    • QUOTED_IDENTIFIER

Uwaga / Notatka

Ustawienie ANSI_WARNINGS na ON powoduje, że ARITHABORT jest automatycznie ustawiane na ON , gdy poziom zgodności bazy danych jest ustawiony na 90 lub wyższy.

Utwórz indeksy na utrwalonych obliczonych kolumnach

Czasami można utworzyć obliczoną kolumnę zdefiniowaną za pomocą wyrażenia, które jest deterministyczne, ale nieprecyzyjne. Można to zrobić, gdy kolumna jest oznaczona PERSISTED w instrukcji CREATE TABLE or ALTER TABLE .

Oznacza to, że aparat bazy danych przechowuje obliczone wartości w tabeli i aktualizuje je, gdy zostaną zaktualizowane inne kolumny, od których zależy obliczona kolumna. Aparat bazy danych używa tych utrwalonej wartości podczas tworzenia indeksu w kolumnie i gdy indeks jest przywoływane w zapytaniu.

Ta opcja umożliwia utworzenie indeksu w kolumnie obliczeniowej, gdy aparat bazy danych nie może udowodnić z dokładnością, czy funkcja zwracająca obliczone wyrażenia kolumn, szczególnie funkcję CLR utworzoną w programie .NET Framework, jest zarówno deterministyczna, jak i precyzyjna.

Uwaga / Notatka

Nie można utworzyć filtrowanego indeksu w obliczonej kolumnie.

Dalsze kroki