Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Du kan definiera index för beräknade kolumner så länge följande krav uppfylls:
- Ägarskapskrav
- Determinismkrav
- Precisionskrav
- Krav för datatyp
- Krav för SET-alternativ
Anmärkning
SET QUOTED_IDENTIFIER måste vara ON när du skapar eller ändrar index för beräknade kolumner eller indexerade vyer. Mer information finns i SET QUOTED_IDENTIFIER (Transact-SQL).
Ägarskapskrav
Alla funktionsreferenser i den beräknade kolumnen måste ha samma ägare som tabellen.
Determinismkrav
Uttryck är deterministiska om de alltid returnerar samma resultat för en angiven uppsättning indata. Egenskapen IsDeterministic för funktionen COLUMNPROPERTY rapporterar om en computed_column_expression är deterministisk.
Den computed_column_expression måste vara deterministisk. En computed_column_expression är deterministisk när allt följande är sant:
Alla funktioner som refereras till av uttrycket är deterministiska och exakta. Dessa funktioner omfattar både användardefinierade och inbyggda funktioner. Mer information finns i Deterministiska och nondeterministiska funktioner. Funktioner kan vara oprecisa om den beräknade kolumnen är
PERSISTED. Mer information finns i Skapa index för beständiga beräknade kolumner sent i den här artikeln.Alla kolumner som refereras i uttrycket kommer från tabellen som innehåller den beräknade kolumnen.
Ingen kolumnreferens hämtar data från flera rader. Aggregerade funktioner som
SUMellerAVGär beroende av data från flera rader och skulle göra en computed_column_expression icke-terministisk.Computed_column_expression saknar åtkomst till systemdata eller användardata.
Alla beräknade kolumner som innehåller ett CLR-uttryck (Common Language Runtime) måste vara deterministiska och markerade PERSISTED innan kolumnen kan indexeras. CLR-användardefinierade typuttryck tillåts i beräknade kolumndefinitioner. Beräknade kolumner vars typ är en CLR-användardefinierad typ kan indexeras så länge typen är jämförbar. För mer information, se CLR användardefinierade typer.
CAST och CONVERT
När du refererar till strängliteraler för datumdatatypen i indexerade beräknade kolumner i SQL Server rekommenderar vi att du uttryckligen konverterar literalen till den datumtyp som du vill använda med hjälp av ett deterministiskt datumformatformat. En lista över formatmallar för datumformat som är deterministiska finns i CAST och CONVERT.
Mer information finns i Nondeterministisk konvertering av literal-datumsträngar till DATE-värden.
Kompatibilitetsnivå
Implicit konvertering av icke-Unicode-teckendata mellan sorteringar anses vara icke-deterministisk, såvida inte kompatibilitetsnivån är inställd på 80 eller tidigare.
När inställningen för databaskompatibilitetsnivå är 90kan du inte skapa index för beräknade kolumner som innehåller dessa uttryck. Befintliga beräknade kolumner som innehåller dessa uttryck från en uppgraderad databas kan dock underhållas. Om du använder indexerade beräknade kolumner som innehåller implicita sträng till datum konverteringar, för att undvika eventuell indexskada, se till att inställningarna för LANGUAGE och DATEFORMAT är konsekventa i dina databaser och applikationer.
Kompatibilitetsnivån 90 motsvarar SQL Server 2005 (9.x).
Precisionskrav
Computed_column_expression måste vara exakt. En computed_column_expression är exakt när ett eller flera av följande är sant:
Det är inte ett uttryck för flyttal eller reella datatyper.
Den använder inte en flyttal eller verklig datatyp i sin definition. I följande instruktion är kolumnen
ytill exempel int och deterministisk men inte exakt.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);
Anmärkning
Alla float- eller real-uttryck betraktas som oprecisa och kan inte vara en nyckel för ett index. Ett float- eller real-uttryck kan användas i en indexerad vy men inte som en nyckel. Detta gäller även för beräknade kolumner. Alla funktioner, uttryck eller användardefinierade funktioner anses vara oprecisa om den innehåller flyttal eller verkliga uttryck. Detta inkluderar logiska (jämförelser).
Egenskapen IsPrecise för COLUMNPROPERTY funktionen rapporterar om en computed_column_expression är exakt.
Krav för datatyp
- Den computed_column_expression som definierats för den beräknade kolumnen kan inte utvärderas till datatyperna text, ntext eller bild .
- Beräknade kolumner som härleds från datatyperna image, ntext, text, varchar(max), nvarchar(max), varbinary(max) och xml kan indexeras så länge datatypen för den beräknade kolumnen är tillåten som en indexnyckelkolumn.
- Beräknade kolumner som härleds från bild-, ntext- och textdatatyper kan vara icke-nyckelkolumner (ingår) i ett icke-grupperat index så länge datatypen för den beräknade kolumnen är tillåten som en icke-nyckelindexkolumn.
Krav för SET-alternativ
Alternativet
ANSI_NULLSpå anslutningsnivå måste anges tillONnär instruktionenCREATE TABLEellerALTER TABLEsom definierar den beräknade kolumnen körs. Funktionen OBJECTPROPERTY rapporterar om alternativet är aktiverat via egenskapenIsAnsiNullsOn.Anslutningen där indexet skapas och alla anslutningar som försöker
INSERT,UPDATEellerDELETE-instruktioner som ändrar värden i indexet, måste ha sexSET-alternativ inställda påONoch ett alternativ inställt påOFF. Optimeraren ignorerar ett index i en beräknad kolumn för allaSELECTinstruktioner som körs av en anslutning som inte har samma alternativinställningar.Alternativet
NUMERIC_ROUNDABORTmåste vara inställt påOFF, och följande alternativ måste anges tillON:ANSI_NULLSANSI_PADDINGANSI_WARNINGSARITHABORTCONCAT_NULL_YIELDS_NULLQUOTED_IDENTIFIER
Anmärkning
Inställningen ANSI_WARNINGS till ON implicit anger ARITHABORT till ON när databasens kompatibilitetsnivå är inställd på 90 eller högre.
Skapa index för beständiga beräknade kolumner
Ibland kan du skapa en beräknad kolumn som definieras med ett uttryck som är deterministiskt men oprecist. Du kan göra detta när kolumnen är markerad PERSISTED i instruktionen CREATE TABLE eller ALTER TABLE .
Det innebär att databasmotorn lagrar de beräknade värdena i tabellen och uppdaterar dem när andra kolumner som den beräknade kolumnen är beroende av uppdateras på. Databasmotorn använder dessa bevarade värden när det skapar ett index i kolumnen och när indexet refereras i en fråga.
Med det här alternativet kan du skapa ett index i en beräknad kolumn när databasmotorn inte med noggrannhet kan bevisa om en funktion som returnerar beräknade kolumnuttryck, särskilt en CLR-funktion som skapas i .NET Framework, är både deterministisk och exakt.
Anmärkning
Du kan inte skapa ett filtrerat index i en beräknad kolumn.