Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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).
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 jesql_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
$.aa$.a.bvyvolají chybu, protože cesta$.azahrnuje 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:
- Edice a podporované funkce SQL Serveru 2025
- Edice a podporované funkce SQL Serveru 2022
- Edice a podporované funkce sql Serveru 2019
- Edice a podporované funkce SQL Serveru 2017
- Edice a podporované funkce SQL Serveru 2016
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:
- Edice a podporované funkce SQL Serveru 2025
- Edice a podporované funkce SQL Serveru 2022
- Edice a podporované funkce sql Serveru 2019
- Edice a podporované funkce SQL Serveru 2017
- Edice a podporované funkce SQL Serveru 2016
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] NULLprediká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 (
=) -
LIKEpredikát (aktuálně není podporován) -
IS [NOT] NULLprediká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
$aa$a.bpřekrývají a nejsou povoleny v příkazuCREATE 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');
Související obsah
- DROP INDEX (Transact-SQL)
- dat JSON v SQL Serveru
- EVENTDATA (Transact-SQL)
- sys.index_columns (Transact-SQL)
- sys.indexes (Transact-SQL)