Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná 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
SUMneboAVG, 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_NULLSna úrovni připojení musí být nastavena naON, když je proveden příkazCREATE TABLEneboALTER TABLE, který definuje vypočítaný sloupec. Funkce OBJECTPROPERTY hlásí, zda je možnost zapnuta prostřednictvímIsAnsiNullsOnvlastnosti.Připojení, na kterém je index vytvořen, a všechna připojení, která zkouší
INSERT,UPDATE, neboDELETEpříkazy, které změní hodnoty v indexu, musí mít nastaveno šestSETmožností a jednu možnost nastavenou naOFF. Optimalizátor ignoruje index vypočítaného sloupce pro jakýkoliSELECTpříkaz spuštěný připojením, které nemá stejná nastavení možností.Možnost
NUMERIC_ROUNDABORTmusí být nastavena naOFF, a následující možnosti musí být nastaveny naON:ANSI_NULLSANSI_PADDINGANSI_WARNINGSARITHABORTCONCAT_NULL_YIELDS_NULLQUOTED_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.