Sdílet prostřednictvím


Vytvořit JSON index (Transact-SQL)

Platí pro: SQL Server 2025 (17.x)

Vytváří JSON index na specifikované tabulce a sloupci v SQL Server 2025 (17.x).

Indexy JSON:

  • Vytvoření je možné ještě předtím, než jsou v tabulce data.
  • Lze vytvořit v tabulkách v jiné databázi zadáním kvalifikovaného názvu databáze.
  • Vyžaduje, aby tabulka měla clusterovaný primární klíč.
  • Nelze zadat v indexovaných zobrazeních.

Poznámka:

Vytváření JSON indexů je momentálně ve preview a dostupné pouze v SQL Server 2025 (17.x).

Transact-SQL konvence syntaxe

Syntaxe

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 }
}

Argumenty

název_indexu

Název indexu. Názvy indexů musí být v tabulce jedinečné, ale nemusí být jedinečné v rámci databáze. Názvy indexů musí dodržovat pravidla identifikátorů .

  • ON <objekt> ( json_column_name )

    Určuje objekt (databázi, schéma nebo tabulku), pro který se má index vytvořit, a název sloupce JSON .

  • json_column_name

    Název sloupce datového typu json v table_name, který obsahuje nula nebo více zadaných cest SQL/JSON.

  • sql_json_path

    Cesta SQL/JSON, kterou je potřeba extrahovat a indexovat z json_column_name. Výchozí hodnota je sql_json_path$.

    • Rekurzivně indexuje všechny klíče/hodnoty ze zadané cesty směrem dál.
    • Podporuje až 128 úrovní v cestě k dokumentu JSON.
    • Nepovoluje překrývání.

    Například $.a a $.a.b vyvolají chybu, protože cesta $.a zahrnuje rekurzivně všechny cesty a záměr uživatele je nejasný.

ZAPNUTO filegroup_name

Vytvoří zadaný index pro zadanou skupinu souborů. Pokud není zadané žádné umístění a tabulka není rozdělená na oddíly, index použije stejnou skupinu souborů jako podkladová tabulka. Skupina souborů už musí existovat.

ZAPNUTO "výchozí"

Vytvoří zadaný index ve výchozí skupině souborů.

Výchozí termín v tomto kontextu není klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů, který musí být oddělený jako in ON "default" nebo ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být ON pro aktuální relaci. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.

<objekt>:: =

Plně kvalifikovaný nebo nekvalifikovaný objekt, který se má indexovat.

  • database_name

    Název databáze.

  • schema_name

    Název schématu, do kterého tabulka patří.

  • table_name

    Název tabulky, která se má indexovat.

OPTIMIZE_FOR_ARRAY_SEARCH = { ON | VYPNUTO }

Určuje, jestli jsou vyhledávání polí optimalizovaná v indexu JSON. Výchozí hodnota je OFF.

FILLFACTOR = fillfactor

Určuje procento, které určuje, jak by měl databázový stroj během vytváření nebo opětovného sestavení vytvořit úroveň listu každé stránky indexu. fillfactor musí být celočíselná hodnota od 1 do 100. Výchozí hodnota je 0. Pokud je fillfactor100 nebo 0, databázový stroj vytvoří indexy s listovými stránkami vyplněnými naplno.

Poznámka:

Hodnoty faktoru 0 a 100 jsou stejné ve všech ohledech.

Nastavení FILLFACTOR platí pouze v případech, kdy se index vytvoří nebo znovu sestaví. Databázový stroj dynamicky neuchová zadané procento prázdného místa na stránkách. Chcete-li zobrazit nastavení faktoru vyplnění, použijte zobrazení katalogu sys.indexes .

Vytvoření clusterovaného indexu s FILLFACTOR menším než 100 má vliv na velikost úložného prostoru, který data zaujímají, protože databázový stroj redistribuuje data při jeho vytváření.

Další informace najdete v tématu Určení faktoru vyplnění indexu.

DROP_EXISTING = { ON | VYPNUTO }

Určuje, že pojmenovaný, existující index JSON se zahodí a znovu sestaví. Výchozí hodnota je OFF.

  • ZAPNUTO

    Existující index se odstraní a znovu sestaví. Zadaný název indexu musí být stejný jako aktuálně existující index; definici indexu však lze upravit. Můžete například zadat různé sloupce, pořadí řazení, schéma oddílů nebo možnosti indexu.

  • vypnuto

    Pokud zadaný název indexu již existuje, zobrazí se chyba.

Typ indexu nelze změnit pomocí .DROP_EXISTING

ONLINE = VYPNUTO

Určuje, že podkladové tabulky a přidružené indexy nejsou během operace indexu dostupné pro dotazy a úpravy dat. V této verzi SQL Serveru nejsou pro indexy JSON podporované sestavení online indexů. Pokud je tato možnost nastavená na ON index JSON, vyvolá se chyba. Vynechte možnost ONLINE nebo nastavte ONLINE na hodnotu OFF.

Operace offline indexu, která vytvoří, znovu sestaví nebo odstraní JSON index, získá zámek úpravy schématu (Sch-M) na tabulce. Tím zabráníte všem uživatelům přístup k podkladové tabulce po dobu trvání operace.

Online indexovací operace nejsou dostupné v každé edici SQL Serveru.

Seznam funkcí podporovaných edicemi SQL Serveru ve Windows najdete tady:

ALLOW_ROW_LOCKS = { ON | VYPNUTO }

Určuje, jestli jsou povolené zámky řádků. Výchozí hodnota je ON.

  • ZAPNUTO

    Zámky řádků jsou povoleny při přístupu k indexu. Databázový stroj určuje, kdy se používají zámky řádků.

  • vypnuto

    Zámky řádků se nepoužívají.

ALLOW_PAGE_LOCKS = { ON | VYPNUTO }

Určuje, jestli jsou povolené zámky stránek. Výchozí hodnota je ON.

  • ZAPNUTO

    Zámky stránek jsou povoleny při přístupu k indexu. Databázový stroj určuje, kdy se používají zámky stránek.

  • vypnuto

    Zámky stránek se nepoužívají.

MAXDOP = max_degree_of_parallelism

Přepíše možnost konfigurace max degree of parallelism po dobu trvání operace indexu. Slouží MAXDOP k omezení počtu procesorů používaných při paralelním provádění plánu. Maximum je 64 procesorů.

Důležité

I když je tato MAXDOP možnost syntakticky podporovaná, CREATE JSON INDEX v současné době vždy používá pouze jeden procesor.

max_degree_of_parallelism může být jedna z následujících hodnot.

Hodnota Popis
1 Potlačuje vytvoření paralelního plánu.
>1 Omezuje maximální počet procesorů používaných v paralelní operaci indexu na zadané číslo nebo méně na základě aktuální systémové úlohy.
0 (výchozí) Používá skutečný počet procesorů nebo méně na základě aktuální systémové úlohy.

Další informace najdete v tématu Konfigurace paralelních operací indexu.

Paralelní operace indexu nejsou k dispozici v každé edici SQL Serveru.

Seznam funkcí podporovaných edicemi SQL Serveru ve Windows najdete tady:

DATA_COMPRESSION = { ŽÁDNÁ | ŘÁDEK | STRÁNKA }

Určuje úroveň komprese dat používaná indexem.

  • ŽÁDNÝ

    U dat indexu se nepoužívá žádná komprese.

  • řádek

    Komprese řádků používaná u dat indexem

  • STRÁNKA

    Komprese stránky používaná u dat indexem

Poznámky

Každou možnost lze zadat pouze jednou pro každý CREATE JSON INDEX příkaz. Zadání duplicity jakékoli možnosti vyvolá chybu.

[ ON { filegroup_name | "výchozí" } ]

Pokud pro index JSON zadáte skupinu souborů, index se umístí do této skupiny souborů bez ohledu na schéma dělení tabulky.

Další informace o vytváření indexů naleznete v části Poznámky v CREATE INDEX.

Predikáty podporované s indexem JSON

Operace vyhledávání v dokumentech JSON obsažených ve sloupci JSON v tabulce je možné optimalizovat, pokud ve sloupci JSON existuje index JSON. Index JSON se používá v dotazech s různými výrazy založenými na funkcích JSON.

Následující příklady používají Sales.SalesOrderHeader tabulku v AdventureWorks2025 databázi se sloupcem JSON s názvem Info. Sloupec Info se vytvoří jako typ JSON . Na sloupci Info se také vytvoří index JSON s výchozím nastavením. Následující ukázka kódu ukazuje CREATE JSON INDEX příkaz:

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

Pro ukázkové vyhledávací výrazy použijte jako data následující dokumenty JSON:

ČísloObjednávkyProdeje Informace
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}}

Funkce JSON_PATH_EXISTS

Pomocí funkce JSON_PATH_EXISTS otestujte, jestli v dokumentu JSON existuje zadaná cesta SQL/JSON.

Tento dotaz ukazuje JSON_PATH_EXISTS na sloupci JSON, který je možné optimalizovat pomocí indexu JSON:

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

Index JSON se podporuje s predikátem JSON_PATH_EXISTS a následujícími operátory:

  • Porovnávací operátory (=)
  • IS [NOT] NULL predikát (aktuálně není podporováno)

JSON_VALUE funkce

Pomocí JSON_VALUE extrahujte text JSON nebo skalární hodnotu v zadané cestě SQL/JSON v dokumentu JSON. Následující dotazy ukazují, jak JSON_VALUE lze výraz ve sloupci JSON optimalizovat pomocí indexu JSON.

  • Hledání rovnosti řetězce JSON ve vlastnosti objektu:

    SELECT COUNT(*)
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Customer.Type') = 'IN';
    
  • Hledání rovnosti čísla JSON ve vlastnosti objektu po převodu hodnoty na datový typ int :

    SELECT *
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) = 16167;
    
  • Vyhledání rozsahu pro číslo JSON ve vlastnosti objektu po převodu hodnoty na datový typ int

    SELECT *
    FROM Sales.SalesOrderHeader
    WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) IN (16167, 16517);
    
  • Vyhledávání rozsahu pro číslo JSON ve vlastnosti objektu po převodu hodnoty na datový typ desetinné číslo:

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

Index JSON se podporuje s predikátem JSON_VALUE a následujícími operátory:

  • Porovnávací operátory (=)
  • LIKE predikát (aktuálně není podporován)
  • IS [NOT] NULL predikát (aktuálně není podporován)

JSON_CONTAINS

Funkce JSON_CONTAINS podporuje snadné vyhledávání hodnot JSON v dokumentu JSON, které můžou použít index JSON, pokud je k dispozici ve sloupci JSON . Tato funkce se dá použít k otestování, jestli je skalární hodnota, objekt nebo pole JSON obsažená v zadané cestě SQL/JSON v dokumentu JSON. Hodnoty hledání zadané jako skalární typy SQL se převedou na existující převody typu SQL/JSON. Tato pravidla jsou definována v části chování.

Požadavek

V tabulce, která obsahuje sloupec JSON, se vyžaduje clusteringový klíč. Pokud chybí klíč clusteringu, dojde k chybě. Klíč clusteringu je omezený na 31 sloupců a maximální velikost klíče indexu by měla být menší než 128 bajtů.

Povolení

Uživatel musí mít ALTER oprávnění k tabulce, nebo být členem pevné role serveru sysadmin, nebo členem pevných databázových rolí db_ddladmin a db_owner.

Omezení

Pro příkaz indexu JSON existují následující omezení:

  • V tabulce je možné vytvořit pouze jeden index JSON ve sloupci JSON .
  • V tabulce můžete vytvořit až 249 indexů JSON. Vytvoření více než jednoho indexu JSON pro konkrétní sloupec JSON se nepodporuje.
  • Index JSON nejde vytvořit na počítaných sloupcích JSON .
  • Index JSON nelze vytvořit ve sloupci typu json v zobrazení, proměnné typu tabulka nebo v tabulce optimalizované pro paměť.
  • Index JSON lze vytvořit nebo změnit pouze offline způsobem.
  • Cesty JSON se v definici indexu nemůžou překrývat. Například se $a a $a.b překrývají a nejsou povoleny v příkazu CREATE JSON INDEX.
  • Úprava cest vyžaduje opětovné vytvoření indexu JSON.
  • Indexy JSON nejsou podporované v nápovědě k indexům.
  • Možnost komprese dat není podporovaná.

Příklady

A. Vytvoření indexu JSON ve sloupci JSON

Následující příklad vytvoří tabulku s názvem docs , která obsahuje sloupec typu JSON , content. Příklad pak vytvoří index JSON json_content_index na sloupci content. Příklad vytvoří index JSON pro celý dokument JSON nebo všechny cesty SQL/JSON v dokumentu JSON.

DROP TABLE IF EXISTS docs;

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

CREATE JSON INDEX json_content_index
    ON docs (content);

A. Vytvoření indexu JSON ve sloupci JSON s konkrétními cestami

Následující příklad vytvoří tabulku s názvem docs , která obsahuje sloupec typu JSON , content. Příklad pak vytvoří index JSON json_content_index na sloupci content. Příklad vytvoří index JSON pro konkrétní cesty SQL/JSON v dokumentu JSON.
Příklad také nastaví index FILLFACTOR na 80.

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. Index JSON s optimalizací vyhledávání polí

Následující příklad vrátí indexy JSON pro tabulku dbo.Customers. Index JSON se vytvoří s povolenou možností optimalizace vyhledávání pole.

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