Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: SQL Server 2025 (17.x)
Tworzy indeks JSON na określonej tabeli i kolumnie w SQL Server 2025 (17.x).
Indeksy JSON:
- Można utworzyć przed pojawieniem się danych w tabeli.
- Można utworzyć w tabelach w innej bazie danych, określając kwalifikowaną nazwę bazy danych.
- Wymagaj, aby tabela miała klasterowany klucz podstawowy.
- Nie można określić w widokach indeksowanych.
Uwaga / Notatka
Tworzenie indeksów JSON jest obecnie w wersji podglądowej i dostępne tylko w SQL Server 2025 (17.x).
Transact-SQL konwencje składni
Składnia
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 (w programowaniu)
nazwa_indeksu
Nazwa indeksu. Nazwy indeksów muszą być unikatowe w tabeli, ale nie muszą być unikatowe w bazie danych. Nazwy indeksów muszą być zgodne z regułami identyfikatorów.
Obiekt< ON >( json_column_name )
Określa obiekt (bazę danych, schemat lub tabelę), na którym ma zostać utworzony indeks, oraz nazwę kolumny json .
json_column_name
Nazwa kolumny typu danych JSON , która
table_namezawiera zero lub więcej określonych ścieżek SQL/JSON.sql_json_path
Ścieżka SQL/JSON, która musi zostać wyodrębniona i zindeksowana z
json_column_name. Wartość domyślna tosql_json_path$.- Rekursywnie indeksuje wszystkie klucze i wartości od określonej ścieżki dalej.
- Obsługuje maksymalnie 128 poziomów w ścieżce dokumentu JSON.
- Nie zezwala na nakładanie się.
Na przykład
$.ai$.a.bzgłaszają błąd, ponieważ ścieżka$.aobejmuje rekurencyjnie wszystkie ścieżki, a intencja użytkownika jest niejasna.
W filegroup_name
Tworzy określony indeks w określonej grupie plików. Jeśli nie określono lokalizacji i tabela nie jest partycjonowana, indeks używa tej samej grupy plików co tabela bazowa. Grupa plików musi już istnieć.
W POZYCJI "default"
Tworzy określony indeks w domyślnej grupie plików.
Termin domyślny, w tym kontekście, nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w pliku ON "default" lub ON [default]. Jeśli "default" jest określona QUOTED_IDENTIFIER , opcja musi być ON dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
<obiekt>:: =
W pełni kwalifikowany lub niew pełni kwalifikowany obiekt do indeksowania.
database_name
Nazwa bazy danych.
schema_name
Nazwa schematu, do którego należy tabela.
table_name
Nazwa tabeli do indeksowania.
OPTIMIZE_FOR_ARRAY_SEARCH = { ON | WYŁ. }
Określa, czy wyszukiwania tablic są zoptymalizowane w indeksie JSON. Wartość domyślna to OFF.
FILLFACTOR = wypełnienie
Określa wartość procentową wskazującą, jak pełny aparat bazy danych powinien ustawić poziom liścia każdej strony indeksu podczas tworzenia lub odbudowy indeksu.
fillfactor musi być wartością całkowitą z 1 do 100. Wartość domyślna to 0. Jeśli fillfactor to 100 lub 0, aparat bazy danych tworzy indeksy ze stronami liści wypełnionymi do pełnej pojemności.
Uwaga / Notatka
Wartości współczynnika wypełnienia 0 i 100 są identyczne we wszystkich aspektach.
Ustawienie FILLFACTOR ma zastosowanie tylko podczas tworzenia lub odbudowy indeksu. Aparat bazy danych nie zachowuje dynamicznie określonego procentu pustego miejsca na stronach. Aby wyświetlić ustawienie współczynnika wypełnienia, użyj widoku wykazu sys.indexes .
Utworzenie indeksu klastrowanego z FILLFACTOR mniejszym niż 100 wpływa na ilość miejsca zajmowanego przez dane, ponieważ aparat bazy danych redystrybuuje dane podczas tworzenia indeksu klastrowanego.
Aby uzyskać więcej informacji, zobacz Określanie współczynnika wypełnienia dla indeksu.
DROP_EXISTING = { ON | WYŁ. }
Określa, że nazwany, wstępnie istniejących indeksów JSON jest porzucony i przebudowany. Wartość domyślna to OFF.
NA
Istniejący indeks jest porzucany i odbudowywany. Określona nazwa indeksu musi być taka sama jak aktualnie istniejący indeks; można jednak zmodyfikować definicję indeksu. Można na przykład określić różne kolumny, kolejność sortowania, schemat partycji lub opcje indeksu.
WYŁĄCZONE
Jeśli określona nazwa indeksu już istnieje, zostanie wyświetlony błąd.
Nie można zmienić typu indeksu przy użyciu polecenia DROP_EXISTING.
ONLINE = WYŁĄCZONE
Określa, że tabele bazowe i skojarzone indeksy nie są dostępne dla zapytań i modyfikacji danych podczas operacji indeksu. W tej wersji programu SQL Server kompilacje indeksów online nie są obsługiwane w przypadku indeksów JSON. Jeśli ta opcja jest ustawiona na ON dla indeksu JSON, zostanie zgłoszony błąd. Pomiń opcję ONLINE albo ustaw ONLINE na OFF.
Operacja indeksu w trybie offline, która tworzy, kompiluje lub usuwa indeks JSON, uzyskuje blokadę modyfikacji schematu (Sch-M) w tabeli. Zapobiega to dostępowi wszystkich użytkowników do tabeli bazowej przez czas trwania operacji.
Operacje indeksowania online nie są dostępne w każdej wersji programu SQL Server.
Aby uzyskać listę funkcji obsługiwanych przez wersje programu SQL Server w systemie Windows, zobacz:
- Wersje i obsługiwane funkcje programu SQL Server 2025
- Wersje oraz dostępne funkcje programu SQL Server 2022
- Wersje i obsługiwane funkcje programu SQL Server 2019
- Wersje i obsługiwane funkcje programu SQL Server 2017
- Wersje i obsługiwane funkcje programu SQL Server 2016
ALLOW_ROW_LOCKS = { ON | WYŁ. }
Określa, czy blokady wierszy są dozwolone. Wartość domyślna to ON.
NA
Blokady wierszy są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat bazy danych określa, kiedy są używane blokady wierszy.
WYŁĄCZONE
Blokady wierszy nie są używane.
ALLOW_PAGE_LOCKS = { ON | WYŁ. }
Określa, czy blokady strony są dozwolone. Wartość domyślna to ON.
NA
Blokady stron są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat bazy danych określa, kiedy są używane blokady strony.
WYŁĄCZONE
Blokady stron nie są używane.
MAXDOP = max_degree_of_parallelism
Opcja konfiguracji max degree of parallelism jest zastępowana na czas trwania operacji indeksowania. Użyj MAXDOP polecenia , aby ograniczyć liczbę procesorów używanych w równoległym wykonywaniu planu. Maksymalna wartość to 64 procesory.
Ważne
MAXDOP Chociaż opcja jest obsługiwana syntatycznie, CREATE JSON INDEX obecnie zawsze używa tylko jednego procesora.
max_degree_of_parallelism może być jedną z następujących wartości.
| Wartość | Opis |
|---|---|
1 |
Zatrzymuje generowanie planu równoległego. |
>1 |
Ogranicza maksymalną liczbę procesorów używanych w operacji indeksowania równoległego do określonej liczby lub mniejszej na podstawie bieżącego obciążenia systemu. |
0 (ustawienie domyślne) |
Używa rzeczywistej liczby procesorów lub mniej na podstawie bieżącego obciążenia systemu. |
Aby uzyskać więcej informacji, zobacz Konfigurowanie operacji indeksowania równoległego.
Operacje indeksowania równoległego nie są dostępne w każdej wersji programu SQL Server.
Aby uzyskać listę funkcji obsługiwanych przez wersje programu SQL Server w systemie Windows, zobacz:
- Wersje i obsługiwane funkcje programu SQL Server 2025
- Wersje oraz dostępne funkcje programu SQL Server 2022
- Wersje i obsługiwane funkcje programu SQL Server 2019
- Wersje i obsługiwane funkcje programu SQL Server 2017
- Wersje i obsługiwane funkcje programu SQL Server 2016
DATA_COMPRESSION = { NONE | WIERSZ | STRONA }
Określa poziom kompresji danych używany przez indeks.
ŻADEN
Indeks nie użył kompresji danych
row
Kompresja wierszy stosowana dla danych za pomocą indeksu
STRONA
Kompresja strony stosowana na danych przez indeks
Uwagi
Każdą z opcji można określić tylko raz w CREATE JSON INDEX instrukcji. Określenie duplikatu dowolnej opcji powoduje wystąpienie błędu.
[ ON { filegroup_name | "domyślne" } ]
Jeśli określisz grupę plików dla indeksu JSON, indeks zostanie umieszczony w tej grupie plików, niezależnie od schematu partycjonowania tabeli.
Aby uzyskać więcej informacji na temat tworzenia indeksów, zobacz sekcję Uwagi w sekcji CREATE INDEX.
Predykaty obsługiwane za pomocą indeksu JSON
Operacje wyszukiwania w dokumentach JSON zawartych w kolumnie JSON w tabeli można zoptymalizować, jeśli indeks JSON istnieje w kolumnie json . Indeks JSON jest używany w zapytaniach z różnymi wyrażeniami opartymi na funkcjach JSON.
W poniższych przykładach użyto tabeli Sales.SalesOrderHeader w bazie danych AdventureWorks2025 z kolumną json o nazwie Info. Kolumna Info jest tworzona jako typ json . Indeks JSON jest również tworzony w kolumnie Info z ustawieniami domyślnymi. Poniższy przykład kodu pokazuje instrukcję CREATE JSON INDEX :
CREATE JSON INDEX sales_info_idx
ON Sales.SalesOrderHeader (Info);
W przypadku przykładowych wyrażeń wyszukiwania użyj następujących dokumentów JSON jako danych:
| numer zamówienia sprzedaży | Informacje |
|---|---|
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}} |
funkcja JSON_PATH_EXISTS
Użyj funkcji JSON_PATH_EXISTS , aby sprawdzić, czy określona ścieżka SQL/JSON istnieje w dokumencie JSON.
To zapytanie pokazuje JSON_PATH_EXISTS w kolumnie json , którą można zoptymalizować przy użyciu indeksu JSON:
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE JSON_PATH_EXISTS(Info, '$.Order.IsProcessed') = 1;
Indeks JSON jest obsługiwany z predykatem JSON_PATH_EXISTS i następującymi operatorami:
- Operatory porównania (
=) -
IS [NOT] NULLpredykat (obecnie niewspierany)
Funkcja JSON_VALUE
Użyj JSON_VALUE , aby wyodrębnić tekst JSON / wartość skalarną w określonej ścieżce SQL/JSON w dokumencie JSON. Poniższe zapytania pokazują, jak wyrażenie JSON_VALUE na kolumnie JSON można zoptymalizować przy użyciu indeksu JSON.
Wyszukiwanie równości ciągu JSON we właściwości obiektu:
SELECT COUNT(*) FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.Type') = 'IN';Wyszukiwanie równości numeru JSON we właściwości obiektu po przekonwertowaniu wartości na typ danych int :
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) = 16167;Wyszukiwanie zakresu numeru JSON we właściwości obiektu po przekonwertowaniu wartości na typ danych int :
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) IN (16167, 16517);Wyszukiwanie zakresu dla numeru JSON we właściwości obiektu po przekonwertowaniu wartości na typ danych dziesiętnych :
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Order.TotalDue RETURNING decimal(20, 4)) BETWEEN 1000 and 2000;
Indeks JSON jest obsługiwany z predykatem JSON_VALUE i następującymi operatorami:
- Operatory porównania (
=) -
LIKEpredykat (obecnie nieobsługiwany) -
IS [NOT] NULLpredykat (obecnie nieobsługiwany)
Funkcja JSON_CONTAINS
Funkcja JSON_CONTAINS obsługuje łatwe wyszukiwanie wartości JSON w dokumencie JSON, które może używać indeksu JSON, jeśli istnieje w kolumnie JSON . Ta funkcja może służyć do testowania, czy wartość skalarna, obiekt lub tablica JSON jest zawarta w określonej ścieżce SQL/JSON w dokumencie JSON. Wartości wyszukiwania określone jako typy skalarne SQL są konwertowane na istniejące konwersje typów SQL/JSON. Te reguły są definiowane w sekcji zachowania.
Wymaganie
Klucz klastrowania jest wymagany w tabeli zawierającej kolumnę JSON. Błąd jest zgłaszany, jeśli klucz klastrowania jest nieobecny. Klucz klastrowania jest ograniczony do 31 kolumn, a maksymalny rozmiar klucza indeksu powinien być mniejszy niż 128 bajtów.
Uprawnienia
Użytkownik musi mieć ALTER uprawnienia do tabeli lub być członkiem stałej roli serwera sysadmin lub stałych ról bazy danych db_ddladmin i db_owner.
Ograniczenia
Istnieją następujące ograniczenia dla instrukcji indeksu JSON:
- W kolumnie JSON w tabeli można utworzyć tylko jeden indeks JSON .
- W tabeli można utworzyć maksymalnie 249 indeksów JSON. Tworzenie więcej niż jednego indeksu JSON w określonej kolumnie JSON nie jest obsługiwane.
- Nie można utworzyć indeksu JSON w obliczonych kolumnach json .
- Nie można utworzyć indeksu JSON w kolumnach json w widoku, zmiennej wartości tabeli lub tabeli zoptymalizowanej pod kątem pamięci.
- Indeks JSON można utworzyć lub zmienić tylko w tryb offline.
- Ścieżki JSON nie mogą nakładać się na definicję indeksu. Na przykład
$ai$a.bnakładają się na siebie i nie są dozwolone w instrukcjiCREATE JSON INDEX. - Modyfikacja ścieżek wymaga ponownego utworzenia indeksu JSON.
- Indeksy JSON nie są obsługiwane we wskazówkach dotyczących indeksu.
- Opcja kompresji danych nie jest obsługiwana.
Przykłady
Odp. Tworzenie indeksu JSON w kolumnie JSON
W poniższym przykładzie zostanie utworzona tabela o nazwie docs zawierająca kolumnę typu json. content W tym przykładzie tworzony jest indeks JSON w json_content_indexkolumnie content . W przykładzie tworzony jest indeks JSON dla całego dokumentu JSON lub wszystkich ścieżek SQL/JSON w dokumencie JSON.
DROP TABLE IF EXISTS docs;
CREATE TABLE docs
(
content JSON,
id INT PRIMARY KEY
);
CREATE JSON INDEX json_content_index
ON docs (content);
Odp. Tworzenie indeksu JSON w kolumnie JSON z określonymi ścieżkami
W poniższym przykładzie zostanie utworzona tabela o nazwie docs zawierająca kolumnę typu json. content W tym przykładzie tworzony jest indeks JSON w json_content_indexkolumnie content . W przykładzie tworzony jest indeks json dla określonych ścieżek SQL/JSON w dokumencie JSON.
W przykładzie ustawiono również indeks 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. Indeks JSON z optymalizacją wyszukiwania tablicy
Poniższy przykład zwraca indeksy JSON dla tabeli dbo.Customers. Indeks JSON jest tworzony z włączoną opcją optymalizacji wyszukiwania tablicy.
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');