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


JSON-INDEX LÉTREHOZÁSA (Transact-SQL)

A következőkre vonatkozik: SQL Server 2025 (17.x)

Létrehoz egy JSON indexet egy meghatározott táblán és oszlopon az SQL Server 2025 (17.x) fájlban.

JSON-indexek:

  • Létre lehet hozni, mielőtt a táblában vannak adatok.
  • Egy másik adatbázisban lévő táblákon egy minősített adatbázisnév megadásával hozható létre.
  • A táblának klaszteres elsődleges kulccsal kell rendelkeznie.
  • Indexelt nézetekben nem adható meg.

Megjegyzés:

A JSON indexek létrehozása jelenleg előnézetben van, és csak SQL Server 2025 (17.x) verzióban érhető el.

Transact-SQL szintaxis konvenciók

Szemantika

CREATE JSON INDEX name ON table_name (json_column_name)
  [ FOR ( sql_json_path [ , ...n ] ) ]
  [ WITH ( <json_index_option> [ , ...n ] ) ]
  [ ON { filegroup_name | "default" } ]
[ ; ]

<object> ::=
    { database_name.schema_name.table_name | schema_name.table_name | table_name }

<sql_json_path> ::=
    { character_string_literal }

<json_index_option> ::=
{
    OPTIMIZE_FOR_ARRAY_SEARCH = { ON | OFF }
  | FILLFACTOR = fillfactor
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = OFF
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
}

Érvek

index_name

Az index neve. Az indexneveknek egyedinek kell lenniük egy táblában, de nem kell egyedinek lenniük az adatbázisban. Az indexneveknek az azonosítók szabályait kell követnie.

  • ON <objektum> ( json_column_name )

    Megadja azt az objektumot (adatbázist, sémát vagy táblát), amelyen az indexet létre szeretné hozni, valamint a json oszlop nevét.

  • json_column_name

    A json-adattípus oszlopának neve, amely a table_name megadott SQL/JSON-elérési utak közül nullát vagy többet tartalmaz.

  • sql_json_path

    A json_column_name-ből kinyerni és indexelni kívánt SQL/JSON elérési út. Az alapértelmezett érték a sql_json_path következő $: .

    • Rekurzív módon indexeli a megadott elérési út összes kulcsát/értékét.
    • A JSON-dokumentum elérési útjának legfeljebb 128 szintjét támogatja.
    • Nem engedélyezi az átfedést.

    Például $.a$.a.b hibát jelez, mivel az elérési út $.a rekurzív módon tartalmazza az összes elérési utat, és a felhasználói szándék nem egyértelmű.

A filegroup_name

Létrehozza a megadott indexet a megadott fájlcsoporton. Ha nincs megadva hely, és a tábla nincs particionálva, az index ugyanazt a fájlcsoportot használja, mint az alapul szolgáló tábla. A fájlcsoportnak már léteznie kell.

ON "default" (alapértelmezett)

Létrehozza a megadott indexet az alapértelmezett fájlcsoporton.

Ebben a kontextusban az alapértelmezett kifejezés nem kulcsszó. Ez az alapértelmezett fájlcsoport azonosítója, és el kell tagoltnak lennie, mint a fájlban vagy ON "default"a fájlbanON [default]. Ha "default" meg van adva, a QUOTED_IDENTIFIER beállításnak az aktuális munkamenethez kell lennie ON . Ez az alapértelmezett beállítás. További információ: SET QUOTED_IDENTIFIER.

<objektum>:: =

A teljesen vagy nem teljesen kvalifikált objektum, amelyet indexelni kell.

  • database_name

    Az adatbázis neve.

  • schema_name

    Annak a sémának a neve, amelyhez a tábla tartozik.

  • table_name

    Az indexelendő tábla neve.

OPTIMIZE_FOR_ARRAY_SEARCH = { ON | KI }

Megadja, hogy a tömbkeresések optimalizálva vannak-e a JSON-indexben. Az alapértelmezett érték a OFF.

FILLFACTOR = fillfactor

Százalékos értéket ad meg, amely azt jelzi, hogy az adatbázismotornak mennyire kell az egyes indexlapok levélszintjének szintjét létrehoznia az index létrehozása vagy újraépítése során. A fillfactor értékének egész számnak kell lennie a következőtől 1 a következőig 100: . Az alapértelmezett érték a 0. Ha a fillfactor értéke 100 vagy 0, az adatbázismotor olyan indexeket hoz létre, amelyek levéloldalai kapacitásra vannak kitöltve.

Megjegyzés:

A faktorértékek 0 és 100 minden szempontból azonosak.

A FILLFACTOR beállítás csak az index létrehozásakor vagy újraépítésekor érvényes. Az adatbázismotor nem tartja dinamikusan a lapokban megadott üres terület százalékos arányát. A kitöltési tényező beállításának megtekintéséhez használja a sys.indexes katalógusnézetet.

Fürtözött index létrehozása FILLFACTOR kisebb, mint 100, befolyásolja az adatok által elfoglalt tárterületet, mivel az adatbázismotor újraosztja az adatokat a fürtözött index létrehozásakor.

További információ: Kitöltési tényező megadása index.

DROP_EXISTING = { ON | KI }

A névvel ellátott, már létező JSON-index elvetését és újraépítését adja meg. Az alapértelmezett érték a OFF.

  • BE

    A meglévő indexet törlik és újjáépítik. A megadott indexnévnek meg kell egyeznie a jelenleg meglévő index nevével; azonban az indexdefiníció módosítható. Megadhat például különböző oszlopokat, rendezési sorrendet, partíciós sémát vagy indexbeállításokat.

  • KI

    Hiba jelenik meg, ha a megadott indexnév már létezik.

Az index típusa nem módosítható a használatával DROP_EXISTING.

ONLINE = KIKAPCSOLVA

Azt határozza meg, hogy az alapul szolgáló táblák és a kapcsolódó indexek nem érhetők el a lekérdezésekhez és az adatok módosításához az indexművelet során. Az SQL Server ezen verziójában az online indexek összeállítása nem támogatott A JSON-indexek esetében. Ha ez a beállítás JSON-indexre van állítva ON , a rendszer hibát jelez. Hagyja ki a ONLINE opciót, vagy állítsa ONLINE-t OFF-re.

Egy offline indexművelet, amely létrehoz, újraépít vagy elvet egy JSON-indexet, sémamódosítási (Sch-M) zárolást szerez be a táblán. Ez megakadályozza, hogy a művelet időtartama alatt minden felhasználó hozzáférjen a mögöttes táblához.

Az online indexelési műveletek nem érhetők el az SQL Server minden kiadásában.

Az SQL Server windowsos kiadásai által támogatott funkciók listáját a következő témakörben találja:

ALLOW_ROW_LOCKS = { ON | KI }

Megadja, hogy engedélyezettek-e a sorzárolások. Az alapértelmezett érték a ON.

  • BE

    Az index elérésekor sorzárolások engedélyezettek. Az adatbázismotor határozza meg a sorzárolások használatát.

  • KI

    A sorzárak nem használhatók.

ALLOW_PAGE_LOCKS = { ON | KI }

Megadja, hogy engedélyezettek-e az oldalzárolások. Az alapértelmezett érték a ON.

  • BE

    Az index elérésekor az oldalzárolások engedélyezettek. Az adatbázismotor határozza meg az oldalzárolások használatát.

  • KI

    Az oldalzárakat nem használja a rendszer.

MAXDOP = max_degree_of_parallelism

Felülbírálja az max degree of parallelism indexművelet időtartamára vonatkozó konfigurációs beállítást. A párhuzamos terv végrehajtásához használt processzorok számának korlátozására használható MAXDOP . A maximális érték 64 processzor.

Fontos

Bár a MAXDOP lehetőség szintaktikailag támogatott, CREATE JSON INDEX jelenleg csak egyetlen processzort használ.

max_degree_of_parallelism az alábbi értékek egyike lehet.

Érték Leírás
1 Letiltja a párhuzamos tervgenerálást.
>1 A párhuzamos indexműveletekben használt processzorok maximális számát a megadott számra vagy annál kevesebbre korlátozza az aktuális rendszerterhelés alapján.
0 (alapértelmezett) A processzorok tényleges számát használja, vagy kevesebbet az aktuális rendszerterhelés alapján.

További információ: Párhuzamos indexelési műveletek konfigurálása.

A párhuzamos indexműveletek nem érhetők el az SQL Server minden kiadásában.

Az SQL Server windowsos kiadásai által támogatott funkciók listáját a következő témakörben találja:

DATA_COMPRESSION = { NONE | SOR | PAGE }

Meghatározza az index által használt adattömörítés szintjét.

  • Egyik sem

    Az index nem használ tömörítést az adatokhoz

  • SOR

    Az index által az adatokon használt sortömörítés

  • OLDAL

    Az index által az adatokon használt laptömörítés

Megjegyzések

Minden beállítás csak egyszer adható meg utasításonként CREATE JSON INDEX. Ha egy beállítás duplikátumát adja meg, az hibát jelez.

[ ON { filegroup_name | "alapértelmezett" } ]

Ha egy JSON-indexhez fájlcsoportot ad meg, az index az adott fájlcsoportra kerül, függetlenül a tábla particionálási sémájától.

Az indexek létrehozásával kapcsolatos további információkért tekintse meg az INDEX LÉTREHOZÁSA szakasz Megjegyzések szakaszát.

JSON-indextel támogatott predikátumok

A tábla JSON-oszlopában található JSON-dokumentumokon végzett keresési műveletek optimalizálhatók, ha a JSON-oszlopban JSON-index található. A JSON-index különböző JSON-függvényalapú kifejezéseket tartalmazó lekérdezésekben használatos.

Az alábbi példák az Sales.SalesOrderHeader adatbázisban lévő AdventureWorks2025 táblát használják egy json nevű Infooszlopmal. Az Info oszlop JSON-típusként jön létre. A JSON-index az alapértelmezett beállításokkal rendelkező oszlopon Info is létrejön. Az alábbi kódminta az utasítást CREATE JSON INDEX mutatja be:

CREATE JSON INDEX sales_info_idx
    ON Sales.SalesOrderHeader (Info);

A minta keresési kifejezésekhez használja az alábbi JSON-dokumentumokat adatként:

Értékesítési rendelés száma Információ
437 {"Customer":{"Name":"Kelsey Raje","ID":16517,"Type":"IN"},"Order":{"ID":43710,"Number":"SO43710","CreationDate":"2011-06-02T00:00:00","TotalDue":3953.9884}}
643 {"Customer":{"Name":"Aaron Campbell","ID":16167,"Type":"IN"},"Order":{"ID":64304,"Number":"SO64304","CreationDate":"2014-01-16T00:00:00","TotalDue":36.0230, "IsProcessed": true}}

JSON_PATH_EXISTS függvény

A JSON_PATH_EXISTS függvénnyel tesztelheti, hogy létezik-e egy megadott SQL/JSON-elérési út egy JSON-dokumentumban.

Ez a lekérdezés JSON_PATH_EXISTS egy JSON-oszlopon mutatja be, amely JSON-index használatával optimalizálható:

SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE JSON_PATH_EXISTS(Info, '$.Order.IsProcessed') = 1;

A JSON indexet a JSON_PATH_EXISTS predikátummal és a következő operátorokkal támogatják:

  • Összehasonlító operátorok (=)
  • IS [NOT] NULL predikátum (jelenleg nem támogatott)

JSON_VALUE függvény

A JSON_VALUE használatával kinyerheti a JSON-szöveg/skaláris értéket egy adott SQL/JSON-elérési úton egy JSON-dokumentumban. Az alábbi lekérdezések bemutatják, hogyan optimalizálható egy JSON_VALUEJSON-oszlop kifejezése JSON-index használatával.

  • JSON-sztring egyenlőségi keresése objektumtulajdonságokban:

    SELECT COUNT(*)
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Customer.Type') = 'IN';
    
  • Egy objektumtulajdonság JSON-számának egyenlőségi keresése az érték int adattípussá alakítása után:

    SELECT *
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) = 16167;
    
  • Egy objektumtulajdonság JSON-számának tartománykeresése az érték int adattípussá alakítása után:

    SELECT *
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) IN (16167, 16517);
    
  • Egy objektumtulajdonság JSON-számának tartománykeresése az érték decimális adattípussá alakítása után:

    SELECT *
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Order.TotalDue RETURNING decimal(20, 4)) BETWEEN 1000 and 2000;
    

A JSON-indexet predikátum és a következő operátorok támogatják JSON_VALUE :

  • Összehasonlító operátorok (=)
  • LIKE predikátum (jelenleg nem támogatott)
  • IS [NOT] NULL predikátum (jelenleg nem támogatott)

JSON_CONTAINS függvény

A JSON_CONTAINS függvény támogatja az olyan JSON-dokumentumok JSON-értékeinek egyszerű keresését, amelyek JSON-indexet használhatnak, ha json-oszlopban vannak. Ez a függvény használható annak ellenőrzésére, hogy egy JSON-skaláris érték, objektum vagy tömb szerepel-e egy JSON-dokumentumban megadott SQL/JSON-elérési úton. Az SQL skaláris típusokként megadott keresési értékek konvertálása meglévő SQL/JSON-típusátalakítások alapján. Ezek a szabályok a viselkedési szakaszban vannak definiálva.

Követelmény

A JSON oszlopot tartalmazó táblában fürtkulccsal kell rendelkeznie. A fürtkulccsal kapcsolatos hiba akkor jelenik meg, ha a fürtkulccsal nem rendelkezik. A fürtözési kulcs legfeljebb 31 oszlopból áll, és az indexkulcs maximális méretének 128 bájtnál kisebbnek kell lennie.

Engedélyek

A felhasználónak engedéllyel kell rendelkeznie ALTER a táblában, vagy tagja kell lennie a sysadmin rögzített kiszolgálói szerepkörnek, vagy a db_ddladmin és db_owner rögzített adatbázis-szerepköröknek.

Korlátozások

A JSON-indexutasításra a következő korlátozások vonatkoznak:

  • Egy tábla JSON-oszlopán csak egy JSON-index hozható létre.
  • Legfeljebb 249 JSON-indexet hozhat létre egy táblában. Egynél több JSON-index létrehozása egy adott JSON-oszlopon nem támogatott.
  • A JSON-index nem hozható létre számított JSON-oszlopokon .
  • JSON-index nem hozható létre nézetben, táblaértékes változóban vagy memóriaoptimalizált táblában lévő JSON-oszlopokon .
  • A JSON-indexek csak offline módon hozhatók létre vagy módosíthatók.
  • A JSON-útvonalak nem fedhetik át egymást az indexdefinícióban. Például átfedésben $a$a.b , és nem engedélyezett az CREATE JSON INDEX utasításban.
  • Az elérési utak módosításához újra kell használni a JSON-indexet.
  • A JSON-indexek nem támogatottak az indexmutatókban.
  • Az adattömörítési beállítás nem támogatott.

Példák

Egy. JSON-index létrehozása JSON-oszlopon

Az alábbi példa létrehoz egy docs típusú oszlopot tartalmazó táblátcontent. A példa ezután létrehoz egy JSON-indexet json_content_indexaz content oszlopban. A példa létrehozza a json-indexet a teljes JSON-dokumentumon vagy a JSON-dokumentumban található összes SQL/JSON-útvonalon.

DROP TABLE IF EXISTS docs;

CREATE TABLE docs
(
    content JSON,
    id INT PRIMARY KEY
);

CREATE JSON INDEX json_content_index
    ON docs (content);

Egy. JSON-index létrehozása adott elérési utakkal rendelkező JSON-oszlopon

Az alábbi példa létrehoz egy docs típusú oszlopot tartalmazó táblátcontent. A példa ezután létrehoz egy JSON-indexet json_content_indexaz content oszlopban. A példa létrehozza a JSON-indexet a JSON-dokumentumban található adott SQL/JSON-útvonalakon.
A példa a FILLFACTOR indexet is a következőre 80állítja: .

DROP TABLE IF EXISTS docs;

CREATE TABLE docs
(
    content JSON,
    id INT PRIMARY KEY
);

CREATE JSON INDEX json_content_index
    ON docs (content)
    FOR ('$.a', '$.b') WITH (FILLFACTOR = 80);

B. JSON-index tömbkeresés-optimalizálással

Az alábbi példa a tábla dbo.CustomersJSON-indexeit adja vissza. A JSON-index úgy jön létre, hogy engedélyezve van a tömbkeresés optimalizálási lehetősége.

DROP TABLE IF EXISTS dbo.Customers;

CREATE TABLE dbo.Customers
(
    customer_id INT IDENTITY PRIMARY KEY,
    customer_info JSON NOT NULL
);

CREATE JSON INDEX CustomersJsonIndex
    ON dbo.Customers (customer_info) WITH (OPTIMIZE_FOR_ARRAY_SEARCH = ON);

INSERT INTO dbo.Customers (customer_info)
VALUES ('{"name":"customer1", "email": "customer1@example.com", "phone":["123-456-7890", "234-567-8901"]}');

SELECT object_id,
       index_id,
       optimize_for_array_search
FROM sys.json_indexes AS ji
WHERE object_id = OBJECT_ID('dbo.Customers');