Megosztás a következőn keresztül:


Számított oszlopok indexei

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

A számított oszlopok indexeit a következő követelmények teljesülése után határozhatja meg:

  • Tulajdonosi követelmények
  • Determinizmusra vonatkozó követelmények
  • Pontossági követelmények
  • Adattípusra vonatkozó követelmények
  • SET opció követelmények

Megjegyzés:

SET QUOTED_IDENTIFIER akkor kell lennie ON , ha számított oszlopokon vagy indexelt nézeteken hoz létre vagy módosít indexeket. További információ: SET QUOTED_IDENTIFIER (Transact-SQL).

Tulajdonosi követelmények

A számított oszlopban lévő összes függvényhivatkozásnak ugyanazzal a tulajdonossal kell rendelkeznie, mint a táblának.

Determinizmusra vonatkozó követelmények

A kifejezések determinisztikusak, ha mindig ugyanazt az eredményt adnak vissza egy megadott bemenethez. A IsDeterministicCOLUMNPROPERTY függvény tulajdonsága azt jelzi, hogy egy computed_column_expression determinisztikus-e.

A computed_column_expression determinisztikusnak kell lennie. A computed_column_expression determinisztikus, ha az alábbiak mindegyike igaz:

  • A kifejezés által hivatkozott összes függvény determinisztikus és pontos. Ezek a függvények magukban foglalják a felhasználó által definiált és a beépített függvényeket is. További információ: Determinisztikus és Nemdeterminista függvények. A függvények pontatlanok lehetnek, ha a számított oszlop .PERSISTED További információ: Indexek létrehozása a tartósan számított oszlopokon a jelen cikk késői részében.

  • A kifejezésben hivatkozott összes oszlop a számított oszlopot tartalmazó táblából származik.

  • Egyetlen oszlophivatkozás sem kér le adatokat több sorból. Például az olyan összesítő függvények, mint SUM vagy AVG, több sorból származó adatoktól függnek, és ez computed_column_expression-t nem determinisztikussá teszi.

  • A computed_column_expression nem rendelkezik rendszeradatokhoz vagy felhasználói adatokhoz való hozzáféréssel.

Minden olyan számított oszlopnak, amely közös nyelvi futtatókörnyezeti (CLR) kifejezést tartalmaz, determinisztikusnak kell lennie, és meg kell jelölnie PERSISTED az oszlop indexelése előtt. A CLR felhasználó által definiált típuskifejezések a számított oszlopdefiníciókban engedélyezettek. A felhasználó által definiált CLR-típust használó számított oszlopok indexelhetők, amíg a típus összehasonlítható. További információért lásd: CLR felhasználó által definiált típusok.

CAST és CONVERT

Ha az SQL Server számított, indexelt oszlopaiban a dátum adattípusának szöveges literáljára hivatkozik, javasoljuk, hogy a literált explicit módon konvertálja a kívánt dátumtípusra egy determinisztikus dátumformátum használatával. A determinisztikus dátumformátum-stílusok listáját a CAST és a CONVERT című témakörben találja.

További információ: A konstans dátumsztringek dátumértékekké való nemdeterminisztikus átalakítása.

Kompatibilitási szint

A nem Unicode karakteradatok rendezések közötti implicit konvertálása nem determinisztikusnak tekinthető, kivéve, ha a kompatibilitási szintet 0-ra vagy korábbanira állítják.

Az adatbázis-kompatibilitási szint beállítása 90esetén nem hozhat létre indexeket az ezeket a kifejezéseket tartalmazó számított oszlopokon. A frissített adatbázisból származó kifejezéseket tartalmazó meglévő számított oszlopok azonban karbantarthatók. Ha olyan indexelt számított oszlopokat használ, amelyek implicit stringről dátumra történő konvertálásokat tartalmaznak, az index esetleges sérülésének elkerülése érdekében győződjön meg arról, hogy a LANGUAGE és DATEFORMAT beállítások konzisztensek az adatbázisokban és az alkalmazásokban.

A kompatibilitási szint 90 az SQL Server 2005 -nek (9.x) felel meg.

Pontossági követelmények

A computed_column_expression pontosnak kell lennie. A computed_column_expression akkor pontosak, ha az alábbiak közül egy vagy több igaz:

  • Ez nem a lebegőpontos vagy valós adattípusok kifejezése.

  • Nem használ lebegőpontos vagy valós adattípust a definíciójában. Az alábbi utasításban például az oszlop yint és determinisztikus, de nem pontos.

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

Megjegyzés:

A lebegőpontos vagy valós kifejezés nem tekinthető pontatlannak, és nem lehet index kulcsa; a lebegőpontos vagy valós kifejezés indexelt nézetben használható, kulcsként azonban nem. Ez a számított oszlopokra is igaz. A függvények, kifejezések vagy felhasználó által definiált függvények pontatlannak minősülnek, ha lebegőpontos vagy valós kifejezéseket tartalmaznak. Ez magában foglalja a logikai elemeket (összehasonlításokat).

A IsPrecise függvény tulajdonsága jelzi, COLUMNPROPERTY hogy egy computed_column_expression pontos-e.

Adattípusra vonatkozó követelmények

  • A számított oszlophoz definiált computed_column_expression nem lehet kiértékelni a szöveg, az ntext vagy a kép adattípusát.
  • A képből, ntextből, szövegből, varchar(max), nvarchar(max), varbinary(max) és XML-adattípusokból származó számított oszlopok indexelhetők mindaddig, amíg a számított oszlop adattípusa indexkulcsoszlopként engedélyezhető.
  • A kép-, ntext- és szöveges adattípusokból származtatott számított oszlopok lehetnek nem kulcsalapú (belefoglalt) oszlopok egy nemclustered indexben, feltéve, hogy a számított oszlop adattípusa nem kulcsalapú indexoszlopként engedélyezhető.

SET beállítási követelmények

  • A ANSI_NULLS kapcsolatszintű beállítást akkor kell ON állítani, amikor a számított oszlopot meghatározó CREATE TABLE vagy ALTER TABLE utasítást végrehajtják. Az OBJECTPROPERTY függvény azt jelzi, hogy a beállítás be van-e kapcsolva a IsAnsiNullsOn tulajdonságon keresztül.

  • A kapcsolatnak, amelyen az index létrejön, valamint az összes olyan kapcsolatnak, amely INSERT, UPDATE, vagy DELETE utasításokat próbál végrehajtani, amelyek módosítják az index értékeit, hat SET beállítással ON módon kell rendelkeznie, és egy beállításnak OFF módon kell lennie beállítva. Az optimalizáló figyelmen kívül hagyja a számított oszlop indexét minden olyan SELECT utasítás esetében, amelyet egy olyan kapcsolat hajt végre, amely nem rendelkezik ugyanezekkel a beállítási beállításokkal.

    A NUMERIC_ROUNDABORT beállítást a következő értékre OFFkell állítani, és a következő beállításokat kell beállítani ON:

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

Megjegyzés:

A ANSI_WARNINGS beállítása ON értékre implicit módon beállítja a ARITHABORT-t ON-re, ha az adatbázis kompatibilitási szintje 90 vagy magasabb.

Indexek létrehozása a megőrzött számított oszlopokon

Néha létrehozhat egy olyan számított oszlopot, amely determinisztikus, de pontatlan kifejezéssel van definiálva. Ezt akkor teheti meg, ha az oszlop meg van jelölve a PERSISTED vagy CREATE TABLE utasításban ALTER TABLE.

Ez azt jelenti, hogy az adatbázismotor tárolja a számított értékeket a táblában, és frissíti őket, amikor a számított oszloptól függő egyéb oszlopok frissülnek. Az adatbázismotor akkor használja ezeket a megőrzött értékeket, amikor indexet hoz létre az oszlopon, és amikor az indexre hivatkozik egy lekérdezés.

Ezzel a beállítással indexet hozhat létre egy számított oszlopon, ha az Adatbázismotor nem tudja pontosan bizonyítani, hogy a számított oszlopkifejezéseket visszaadó függvények, különösen a .NET-keretrendszerben létrehozott CLR-függvények determinisztikusak és pontosak-e.

Megjegyzés:

Számított oszlopon nem hozható létre szűrt index .

Következő lépések