Sdílet prostřednictvím


Indexy ve vypočítaných sloupcích

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

Indexy můžete definovat pro počítané sloupce, pokud jsou splněny následující požadavky:

  • Požadavky na vlastnictví
  • Požadavky na determinismus
  • Požadavky na přesnost
  • Požadavky na datový typ
  • Požadavky na možnost SET

Poznámka:

SET QUOTED_IDENTIFIER musí být ON při vytváření nebo změně indexů ve vypočítaných sloupcích nebo indexovaných zobrazeních. Další informace naleznete v tématu SET QUOTED_IDENTIFIER (Transact-SQL).

Požadavky na vlastnictví

Všechny odkazy na funkce ve vypočítaných sloupcích musí mít stejného vlastníka jako tabulka.

Požadavky na determinismus

Výrazy jsou deterministické, pokud vždy vrátí stejný výsledek pro zadanou sadu vstupů. Vlastnost IsDeterministic funkce COLUMNPROPERTY hlásí, zda je computed_column_expression deterministický.

Computed_column_expression musí být deterministické. Computed_column_expression je deterministický, pokud jsou splněny všechny následující podmínky:

  • Všechny funkce, na které výraz odkazuje, jsou deterministické a přesné. Mezi tyto funkce patří uživatelem definované i předdefinované funkce. Další informace naleznete v tématu Deterministické a nedeterministické funkce. Funkce mohou být nepřesné, pokud je vypočítaný sloupec PERSISTED. Další informace najdete v tématu Vytváření indexů u trvalých počítaných sloupců pozdě v tomto článku.

  • Všechny sloupce odkazované ve výrazu pocházejí z tabulky, která obsahuje vypočítaný sloupec.

  • Žádný odkaz na sloupec nepřetahuje data z více řádků. Například agregační funkce, jako SUM nebo AVG, závisejí na datech z více řádků a učiní computed_column_expression nedeterministickým.

  • Computed_column_expression nemá přístup k systémovým datům ani přístup k uživatelským datům.

Každý počítaný sloupec, který obsahuje výraz CLR (Common Language Runtime), musí být deterministický a označený PERSISTED před indexem sloupce. Výrazy typů definované uživatelem CLR jsou povoleny v definicích počítaného sloupce. Počítané sloupce, jejichž typ je uživatelem definovaný typ CLR, lze indexovat, pokud je typ srovnatelný. Další informace naleznete v tématu CLR uživatelsky definované typy.

CAST a CONVERT

Pokud odkazujete na řetězcové literály datového typu kalendářního typu v indexovaných počítaných sloupcích v SQL Serveru, doporučujeme explicitně převést literál na požadovaný typ data pomocí stylu deterministického formátu kalendářního data. Seznam stylů formátu kalendářních dat, které jsou deterministické, naleznete v tématu CAST a CONVERT.

Další informace naleznete v tématu Nedeterministický převod literálových řetězců kalendářních dat na hodnoty DATE.

Úroveň kompatibility

Implicitní převod dat znaků bez kódování Unicode mezi kolacemi je považován za nedeterministický, pokud není úroveň kompatibility nastavena na 80 nebo starší.

Pokud je nastavení úrovně kompatibility databáze 90, nemůžete vytvářet indexy pro počítané sloupce, které obsahují tyto výrazy. Existující počítané sloupce, které obsahují tyto výrazy z upgradované databáze, jsou však udržovatelné. Pokud používáte indexované počítané sloupce, které obsahují implicitní převody řetězců na datum, abyste se vyhnuli možnému poškození indexu, ujistěte se, že nastavení v databázích a aplikacích jsou konzistentní LANGUAGE a DATEFORMAT.

Úroveň 90 kompatibility odpovídá SQL Serveru 2005 (9.x).

Požadavky na přesnost

Computed_column_expression musí být přesné. Computed_column_expression je přesné, pokud platí jedna nebo více z následujících hodnot:

  • Nejedná se o výraz plovoucích nebo skutečných datových typů.

  • V definici nepoužívá plovoucí nebo skutečný datový typ. Například v následujícím příkazu je sloupec yint a deterministický, ale není přesný.

    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);
    

Poznámka:

Jakýkoli plovoucí nebo skutečný výraz se považuje za nepřesný a nemůže být klíčem indexu; Plovoucí nebo skutečný výraz lze použít v indexované zobrazení, ale ne jako klíč. To platí i pro počítané sloupce. Libovolná funkce, výraz nebo uživatelem definovaná funkce se považuje za nepřesnou, pokud obsahuje jakékoli plovoucí nebo reálné výrazy. To zahrnuje logické prvky (porovnání).

Vlastnost IsPreciseCOLUMNPROPERTY funkce hlásí, zda je computed_column_expression přesný.

Požadavky na datový typ

  • Výraz pro vypočítaný sloupec definovaný pro vypočítaný sloupec nemůže vyhodnotit na datové typy text, ntext nebo image.
  • Počítané sloupce odvozené z obrázku, ntextu, textu, varchar(max), nvarchar(max), varbinary(max) a datových typů XML je možné indexovat, pokud je datový typ počítaného sloupce povolený jako sloupec klíče indexu.
  • Počítané sloupce odvozené z obrázku, ntextu a textových datových typů můžou být bezklíčové (zahrnuté) sloupce v neclusterovaném indexu, pokud je datový typ počítaného sloupce povolený jako neklíčový indexový sloupec.

Požadavky na možnost SET

  • Možnost ANSI_NULLS na úrovni připojení musí být nastavena na ON, když je proveden příkaz CREATE TABLE nebo ALTER TABLE, který definuje vypočítaný sloupec. Funkce OBJECTPROPERTY hlásí, zda je možnost zapnuta prostřednictvím IsAnsiNullsOn vlastnosti.

  • Připojení, na kterém je index vytvořen, a všechna připojení, která zkouší INSERT, UPDATE, nebo DELETE příkazy, které změní hodnoty v indexu, musí mít nastaveno šest SET možností a jednu možnost nastavenou na OFF. Optimalizátor ignoruje index vypočítaného sloupce pro jakýkoli SELECT příkaz spuštěný připojením, které nemá stejná nastavení možností.

    Možnost NUMERIC_ROUNDABORT musí být nastavena na OFF, a následující možnosti musí být nastaveny na ON:

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

Poznámka:

Nastavením ANSI_WARNINGS na ON se implicitně nastaví ARITHABORT na ON , když je úroveň kompatibility databáze nastavena na 90 nebo vyšší.

Vytváření indexů u trvalých počítaných sloupců

Někdy můžete vytvořit počítaný sloupec definovaný pomocí výrazu, který je deterministický, ale nepřesný. Můžete to udělat, když je sloupec označený PERSISTED v příkazu CREATE TABLE nebo ALTER TABLE.

To znamená, že databázový stroj ukládá vypočítané hodnoty v tabulce a aktualizuje je, když se aktualizují všechny další sloupce, na kterých závisí vypočítaný sloupec. Databázový stroj používá tyto trvalé hodnoty při vytváření indexu ve sloupci a při odkazování na index v dotazu.

Tato možnost umožňuje vytvořit index pro počítaný sloupec, když databázový stroj nemůže prokázat přesnost, zda funkce, která vrací počítaný sloupcový výraz, zejména funkci CLR, která je vytvořená v rozhraní .NET Framework, je deterministický i přesný.

Poznámka:

Ve počítaném sloupci nemůžete vytvořit filtrovaný index.

Další kroky