Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: Предварительная версия SQL Server 2025 (17.x)
Создает индекс JSON для указанной таблицы и столбца в предварительной версии SQL Server 2025 (17.x).
Индексы JSON:
- Можно создать до появления данных в таблице.
- Можно создать в таблицах в другой базе данных, указав полное имя базы данных.
- Требуется, чтобы таблица имела кластеризованный первичный ключ.
- Невозможно указать в индексированных представлениях.
Замечание
Создание индексов JSON в настоящее время доступно в предварительной версии и доступно только в предварительной версии SQL Server 2025 (17.x).
Соглашения о синтаксисе Transact-SQL
Синтаксис
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> ::=
{
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 }
}
Аргументы
имя_индекса
Имя индекса. Имена индексов должны быть уникальными в таблице, но не должны быть уникальными в базе данных. Имена индексов должны соответствовать правилам идентификаторов.
ОБЪЕКТ< ON >(json_column_name )
Указывает объект (базу данных, схему или таблицу), в которой должен быть создан индекс, и имя столбца JSON .
json_column_name
Имя столбца типа данных JSON ,
table_name
содержащего ноль или более указанных путей SQL/JSON.sql_json_path
Путь SQL/JSON, который необходимо извлечь и индексировать из
json_column_name
. Значениеsql_json_path
по умолчанию —$
.- Рекурсивно индексирует все ключи и значения, начиная с указанного пути и далее.
- Поддерживает до 128 уровней в пути документа JSON.
- Не допускает перекрытия.
Например,
$.a
и$.a.b
вызывают ошибку, поскольку путь$.a
рекурсивно включает все пути, и намерение пользователя неясно.
ON filegroup_name
Создает заданный индекс в указанной файловой группе. Если расположение не указано, а таблица не секционирована, индекс использует ту же файловую группу, что и базовая таблица. Файловая группа уже должна существовать.
ON по умолчанию
Создает указанный индекс в файловой группе по умолчанию.
Термин по умолчанию в этом контексте не является ключевым словом. Это идентификатор файловой группы по умолчанию и должен быть разделен как в ON "default"
или ON [default]
. Если "default"
задано, QUOTED_IDENTIFIER
параметр должен быть ON
для текущего сеанса. Это параметр по умолчанию. Дополнительные сведения см. в описании SET QUOTED_IDENTIFIER.
<объект>:: =
Полностью или неполностью квалифицированный объект для индексирования.
database_name
Имя базы данных.
schema_name
Имя схемы, которой принадлежит таблица.
table_name
Имя таблицы для индексирования.
FILLFACTOR = fillfactor
Указывает, на сколько процентов ядро СУБД должно заполнять конечный уровень каждой страницы индекса во время создания и изменения индекса.
Fillfactor должен быть целым значением от1
.100
Значение по умолчанию — 0
. Если fillfactor равен 100
или 0
, ядро СУБД создает индексы со страницами уровня листа, полностью заполненными.
Замечание
Значения 0
коэффициента заполнения и 100
одинаковы во всех отношениях.
Аргумент FILLFACTOR
действует только при создании или перестройке индекса. Ядро СУБД не сохраняет динамически указанный процентный объем свободного места на страницах. Чтобы просмотреть параметр коэффициента заполнения, используйте представление каталога sys.indexes .
Создание кластеризованного индекса со значением FILLFACTOR
, которое меньше 100
, влияет на объем занимаемого места для хранения данных, так как система управления базами данных перераспределяет данные при его создании.
Дополнительные сведения см. в статье Указание коэффициента заполнения для индекса.
DROP_EXISTING = { ON | OFF }
Указывает, что именованный, существующий пространственный индекс удаляется и перестраивается. Значение по умолчанию — OFF
.
НА
Существующий индекс удаляется и перестраивается. Указанное имя индекса должно совпадать с существующим индексом; однако определение индекса можно изменить. Например, можно указать различные столбцы, порядок сортировки, схему секционирования или параметры индекса.
Выкл.
Ошибка отображается, если указанное имя индекса уже существует.
Тип индекса нельзя изменить с помощью DROP_EXISTING
.
ОНЛАЙН = ВЫКЛ.
Указывает, что базовые таблицы и связанные индексы недоступны для запросов и изменения данных во время операции индекса. В этой версии SQL Server сборки индексов в сети не поддерживаются для индексов JSON. Если для индекса JSON задано ON
значение этого параметра, возникает ошибка. Либо опустить ONLINE
параметр, либо задать значение ONLINE
OFF
.
Операция индекса, выполняемая вне сети, которая создает, перестраивает или удаляет индекс JSON, получает блокировку изменения схемы (Sch-M) таблицы. Это предотвращает доступ к базовой таблице всех пользователей во время операции.
Операции с индексами в Сети недоступны в каждом выпуске SQL Server.
Для получения списка возможностей, поддерживаемых выпусками SQL Server на платформе Windows, см. следующий список:
- Выпуски и поддерживаемые функции предварительной версии SQL Server 2025
- Выпуски и поддерживаемые функции SQL Server 2022
- Выпуски и поддерживаемые функции SQL Server 2019
- Выпуски SQL Server 2017 и поддерживаемые функции
- Выпуски и поддерживаемые функции SQL Server 2016
ALLOW_ROW_LOCKS = { ON | OFF } (Включает или отключает блокировки на уровне строк)
Указывает, разрешены ли блокировки строк. Значение по умолчанию — ON
.
НА
Блокировки строк допустимы при доступе к индексу. Ядро СУБД определяет, когда используются блокировки строк.
Выкл.
Блокировки строк не используются.
ALLOW_PAGE_LOCKS (разрешить блокировку страниц) = { ВКЛ. | ВЫКЛ. }
Указывает, разрешены ли блокировки страниц. Значение по умолчанию — ON
.
НА
Блокировки страниц возможны при доступе к индексу. Ядро СУБД определяет, когда используются блокировки страниц.
Выкл.
Блокировки страниц не используются.
MAXDOP = max_degree_of_parallelism
Переопределяет опцию конфигурации max degree of parallelism
на время выполнения операции индекса. Используется MAXDOP
для ограничения количества процессоров, используемых в параллельном выполнении плана. Максимальное значение — 64 процессора.
Это важно
Хотя параметр MAXDOP
синтаксически поддерживается, CREATE SPATIAL INDEX
в настоящее время всегда используется только один процессор.
max_degree_of_parallelism может быть одним из следующих значений.
Ценность | Описание |
---|---|
1 |
Подавляет формирование параллельных планов. |
>1 |
Ограничивает максимальное количество процессоров, используемых в параллельных операциях с индексами, заданным или меньшим числом в зависимости от текущей рабочей нагрузки системы. |
0 (по умолчанию) |
В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров. |
Дополнительные сведения см. в статье Настройка параллельных операций с индексами.
Параллельные операции индексов недоступны в каждом выпуске SQL Server.
Для получения списка возможностей, поддерживаемых выпусками SQL Server на платформе Windows, см. следующий список:
- Выпуски и поддерживаемые функции предварительной версии SQL Server 2025
- Выпуски и поддерживаемые функции SQL Server 2022
- Выпуски и поддерживаемые функции SQL Server 2019
- Выпуски SQL Server 2017 и поддерживаемые функции
- Выпуски и поддерживаемые функции SQL Server 2016
DATA_COMPRESSION = { NONE (нет) | ROW (строка) | PAGE (страница) }
Определяет уровень сжатия данных, используемый индексом.
НЕТ
Сжатие данных по индексу не используется
РЯД
Сжатие строк, используемое для данных индексом
СТРАНИЦА
Сжатие страниц, используемое для данных по индексу
Замечания
Каждый параметр можно указать только один раз для каждой CREATE JSON INDEX
инструкции. При указании дубликата любого параметра возникает ошибка.
[ ON { filegroup_name | "default" } ]
Если указать файловую группу для индекса JSON, индекс помещается в эту файловую группу независимо от схемы секционирования таблицы.
Дополнительные сведения о создании индексов см. в разделе "Примечания" в CREATE INDEX.
Предикаты, поддерживаемые индексом JSON
Операции поиска в документах JSON, содержащихся в столбце JSON в таблице, можно оптимизировать, если индекс JSON существует в столбце json . Индекс JSON используется в запросах с различными выражениями на основе функций JSON.
В следующих примерах используется Sales.SalesOrderHeader
таблица в AdventureWorks2022
базе данных с именем Info
. Столбец Info
создается как тип JSON . Индекс JSON также создается в столбце Info
с параметрами по умолчанию. В следующем примере кода показан оператор CREATE JSON INDEX
:
CREATE JSON INDEX sales_info_idx ON Sales.SalesOrderHeader(Info);
Для примеров выражений поиска используйте следующие документы JSON в качестве данных:
НомерЗаказа | Информация |
---|---|
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
Используйте функцию JSON_PATH_EXISTS для проверки наличия указанного пути SQL/JSON в документе JSON.
Этот запрос демонстрирует JSON_PATH_EXISTS
в столбце JSON, который можно оптимизировать с помощью индекса JSON.
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE JSON_PATH_EXISTS(Info, '$.Order.IsProcessed') = 1;
Индекс JSON поддерживается с JSON_PATH_EXISTS
предикатом и следующими операторами:
- Операторы сравнения (
=
) -
IS [NOT] NULL
предикат (в настоящее время не поддерживается)
функция JSON_VALUE
Используйте JSON_VALUE для извлечения текста и скалярного значения JSON в указанном пути SQL/JSON в документе JSON. В следующих запросах показано, как JSON_VALUE
можно оптимизировать выражение в столбце JSON с помощью индекса JSON.
Поиск равенства строки JSON в свойстве объекта:
SELECT COUNT(*) FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.Type') = 'IN';
Поиск равенства числа JSON в свойстве объекта после преобразования этого значения в тип данных int.
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) = 16167;
Выполнение поиска чисел в JSON в диапазоне значений, хранящихся в свойстве объекта, после преобразования значения в тип данных int.
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) IN (16167, 16517);
Поиск по диапазону числа JSON в свойстве объекта после преобразования значения в десятичный тип данных.
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Order.TotalDue RETURNING decimal(20, 4)) BETWEEN 1000 and 2000;
Индекс JSON поддерживается с предикатом JSON_VALUE
и следующими операторами:
- Операторы сравнения (
=
) -
LIKE
предикат (в настоящее время не поддерживается) -
IS [NOT] NULL
предикат (в настоящее время не поддерживается)
функция JSON_CONTAINS
Функция JSON_CONTAINS поддерживает простой поиск значений JSON в документе JSON, который может использовать индекс JSON при наличии в столбце JSON . Эту функцию можно использовать для проверки того, содержится ли скалярное значение JSON, объект или массив в указанном пути SQL/JSON в документе JSON. Значения поиска, указанные как скалярные типы SQL, преобразуются по существующим преобразованиям типов SQL/JSON. Эти правила определены в разделе поведения.
Требование
Для таблицы, содержащей столбец JSON, требуется ключ кластеризации. Ошибка возникает, если ключ кластеризации отсутствует. Ключ кластеризации ограничен 31 столбцами, а максимальный размер ключа индекса должен быть меньше 128 байт.
Разрешения
Пользователь должен иметь ALTER
разрешение на таблицу или быть членом предопределенной роли сервера sysadmin либо членом предопределенных ролей базы данных db_ddladmin и db_owner.
Ограничения
Для инструкции индекса JSON существуют следующие ограничения:
- Только один индекс JSON можно создать в столбце JSON в таблице.
- В таблице можно создать до 249 индексов JSON. Создание нескольких индексов JSON в определенном столбце JSON не поддерживается.
- Невозможно создать индекс JSON в вычисляемых столбцах JSON .
- Индекс JSON нельзя создать в столбцах json в представлениях, табличных переменных или в таблицах, оптимизированных для памяти.
- Индекс JSON можно создать или изменить только в автономном режиме.
- Пути JSON не могут перекрываться в определении индекса. Например,
$a
и$a.b
перекрываются и не допускаются в инструкцииCREATE JSON INDEX
. - Для изменения путей требуется повторное создание индекса JSON.
- Индексы JSON не поддерживаются в подсказках для индексов.
- Параметр сжатия данных не поддерживается.
Примеры
А. Создание индекса JSON в столбце JSON
В следующем примере создается таблица с именемdocs
, содержащая столбец типа JSON. content
Затем в примере создается индекс JSON в json_content_index
столбце content
. В примере создается индекс JSON по всему документу JSON или по всем путям SQL/JSON в этом документе.
DROP TABLE IF EXISTS docs;
CREATE TABLE docs (content JSON, id INT PRIMARY KEY);
CREATE JSON INDEX json_content_index ON docs(content);
А. Создание индекса JSON в столбце JSON с определенными путями
В следующем примере создается таблица с именемdocs
, содержащая столбец типа JSON. content
Затем в примере создается индекс JSON в json_content_index
столбце content
. В примере создается индекс JSON для определенных путей SQL/JSON в документе JSON.
В примере также устанавливается индекс FILLFACTOR для 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);