Delen via


Indexen voor berekende kolommen

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

U kunt indexen voor berekende kolommen definiëren zolang aan de volgende vereisten wordt voldaan:

  • Eigendomsvereisten
  • Determinismevereisten
  • Precisievereisten
  • Vereisten voor gegevenstypen
  • Vereisten voor SET-opties

Opmerking

SET QUOTED_IDENTIFIER moet zijn ON wanneer u indexen maakt of wijzigt voor berekende kolommen of geïndexeerde weergaven. Zie SET QUOTED_IDENTIFIER (Transact-SQL) voor meer informatie.

Eigendomsvereisten

Alle functieverwijzingen in de berekende kolom moeten dezelfde eigenaar hebben als de tabel.

Determinismevereisten

Expressies zijn deterministisch als ze altijd hetzelfde resultaat retourneren voor een opgegeven set invoer. De IsDeterministic eigenschap van de functie COLUMNPROPERTY rapporteert of een computed_column_expression deterministisch is.

De computed_column_expression moet deterministisch zijn. Een computed_column_expression is deterministisch wanneer alle volgende waar zijn:

  • Alle functies waarnaar wordt verwezen door de expressie, zijn deterministisch en nauwkeurig. Deze functies omvatten zowel door de gebruiker gedefinieerde als ingebouwde functies. Zie Deterministische en niet-deterministische functies voor meer informatie. Functies zijn mogelijk onnauwkeurig als de berekende kolom is PERSISTED. Zie Indexen maken voor persistente berekende kolommen te laat in dit artikel voor meer informatie.

  • Alle kolommen waarnaar in de expressie wordt verwezen, zijn afkomstig uit de tabel die de berekende kolom bevat.

  • Met geen kolomreferentie worden gegevens opgehaald uit meerdere rijen. Statistische functies zoals SUM of AVG zijn bijvoorbeeld afhankelijk van gegevens uit meerdere rijen en maken een computed_column_expression niet-deterministisch.

  • De computed_column_expression heeft geen systeemgegevenstoegang of gebruikersgegevenstoegang.

Elke berekende kolom die een CLR-expressie (Common Language Runtime) bevat, moet deterministisch zijn en gemarkeerd PERSISTED voordat de kolom kan worden geïndexeerd. DOOR de gebruiker gedefinieerde CLR-typeexpressies zijn toegestaan in berekende kolomdefinities. Berekende kolommen waarvan het type een door de gebruiker gedefinieerde CLR-type is, kunnen worden geïndexeerd zolang het type vergelijkbaar is. Zie CLR User-Defined Typen voor meer informatie.

CAST en CONVERTEREN

Wanneer u verwijst naar letterlijke tekenreeksen van het datumgegevenstype in geïndexeerde berekende kolommen in SQL Server, wordt u aangeraden de letterlijke waarde expliciet te converteren naar het gewenste datumtype met behulp van een deterministische datumnotatiestijl. Zie CAST en CONVERT voor een lijst met datumnotatiestijlen die deterministisch zijn.

Zie Niet-deterministische conversie van letterlijke datumtekenreeksen in DATUM-waarden voor meer informatie.

Compatibiliteitsniveau

Impliciete conversie van niet-Unicode-tekengegevens tussen sorteringen wordt beschouwd als niet-deterministisch, tenzij het compatibiliteitsniveau is ingesteld op 80 of eerder.

Wanneer de instelling voor databasecompatibiliteitsniveau is 90, kunt u geen indexen maken voor berekende kolommen die deze expressies bevatten. Bestaande berekende kolommen die deze expressies uit een bijgewerkte database bevatten, kunnen echter worden onderhouden. Als u geïndexeerde berekende kolommen gebruikt die impliciete tekenreeksen tot datumconversies bevatten, om mogelijke beschadiging van de index te voorkomen, moet u ervoor zorgen dat de LANGUAGE en DATEFORMAT instellingen consistent zijn in uw databases en toepassingen.

Compatibiliteitsniveau 90 komt overeen met SQL Server 2005 (9.x).

Precisievereisten

De computed_column_expression moet nauwkeurig zijn. Een computed_column_expression is precies wanneer een of meer van de volgende waarden waar zijn:

  • Het is geen expressie van de float - of echte gegevenstypen.

  • Er wordt geen float - of echt gegevenstype gebruikt in de definitie. In de volgende instructie is de kolom y bijvoorbeeld int en deterministisch, maar niet nauwkeurig.

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

Opmerking

Elke float of echte expressie wordt als onnauwkeurig beschouwd en kan geen sleutel van een index zijn; een float - of echte expressie kan worden gebruikt in een geïndexeerde weergave, maar niet als sleutel. Dit geldt ook voor berekende kolommen. Elke functie, expressie of door de gebruiker gedefinieerde functie wordt als onnauwkeurig beschouwd als deze float - of echte expressies bevat. Dit omvat logische elementen (vergelijkingen).

De IsPrecise eigenschap van de COLUMNPROPERTY functie rapporteert of een computed_column_expression nauwkeurig is.

Vereisten voor gegevenstypen

  • De computed_column_expression die is gedefinieerd voor de berekende kolom, kan niet worden geëvalueerd op de gegevenstypen tekst, ntext of afbeelding .
  • Berekende kolommen die zijn afgeleid van afbeelding, ntext, tekst, varchar(max), nvarchar(max), varbinary(max), en XML-gegevenstypen kunnen worden geïndexeerd zolang het berekende kolomgegevenstype is toegestaan als een indexsleutelkolom.
  • Berekende kolommen die zijn afgeleid van gegevenstypen voor afbeeldingen, ntext en tekst , kunnen niet-sleutelkolommen (opgenomen) zijn in een niet-geclusterde index zolang het berekende kolomgegevenstype is toegestaan als een niet-sleutelindexkolom.

Vereisten voor SET-opties

  • De ANSI_NULLS optie op verbindingsniveau moet worden ingesteld op ON wanneer de CREATE TABLE of ALTER TABLE instructie waarmee de berekende kolom wordt gedefinieerd, wordt uitgevoerd. De functie OBJECTPROPERTY rapporteert of de optie is ingeschakeld via de IsAnsiNullsOn eigenschap.

  • De verbinding waarop de index wordt gemaakt, en alle verbindingen die proberen INSERT, UPDATE, of DELETE uitspraken die waarden in de index wijzigen, moeten zes SET-opties ingesteld hebben op ON en één optie ingesteld hebben op OFF. De optimizer negeert een index op een berekende kolom voor een SELECT instructie die wordt uitgevoerd door een verbinding die niet dezelfde optie-instellingen heeft.

    De NUMERIC_ROUNDABORT optie moet worden ingesteld op OFFen de volgende opties moeten worden ingesteld op ON:

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

Opmerking

Instelling ANSI_WARNINGS op ON stelt impliciet ARITHABORT in op ON wanneer het databasecompatibiliteitsniveau is ingesteld op 90 of hoger.

Indexen maken voor persistente berekende kolommen

Soms kunt u een berekende kolom maken die is gedefinieerd met een expressie die deterministisch maar onnauwkeurig is. U kunt dit doen wanneer de kolom is gemarkeerd PERSISTED in de CREATE TABLE-instructie of ALTER TABLE-instructie.

Dit betekent dat de database-engine de berekende waarden in de tabel opslaat en bijwerken wanneer andere kolommen waarvan de berekende kolom afhankelijk is, worden bijgewerkt. De database-engine gebruikt deze persistente waarden wanneer er een index in de kolom wordt gemaakt en wanneer naar de index wordt verwezen in een query.

Met deze optie kunt u een index maken op een berekende kolom wanneer database-engine niet met nauwkeurigheid kan bewijzen of een functie die berekende kolomexpressies retourneert, met name een CLR-functie die is gemaakt in .NET Framework, zowel deterministisch als nauwkeurig is.

Opmerking

U kunt geen gefilterde index maken voor een berekende kolom.

Volgende stappen