Index för beräknade kolumner

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-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 SUM eller AVG ä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 y till 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_NULLS på anslutningsnivå måste anges till ON när instruktionen CREATE TABLE eller ALTER TABLE som definierar den beräknade kolumnen körs. Funktionen OBJECTPROPERTY rapporterar om alternativet är aktiverat via egenskapen IsAnsiNullsOn .

  • Anslutningen där indexet skapas och alla anslutningar som försöker INSERT, UPDATE eller DELETE-instruktioner som ändrar värden i indexet, måste ha sex SET-alternativ inställda på ON och ett alternativ inställt på OFF. Optimeraren ignorerar ett index i en beräknad kolumn för alla SELECT instruktioner som körs av en anslutning som inte har samma alternativinställningar.

    Alternativet NUMERIC_ROUNDABORT måste vara inställt på OFF, och följande alternativ måste anges till ON:

    • ANSI_NULLS
    • ANSI_PADDING
    • ANSI_WARNINGS
    • ARITHABORT
    • CONCAT_NULL_YIELDS_NULL
    • QUOTED_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.

Nästa steg