Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2025 (17.x)
SQL Server 2025 (17.x)'de belirtilen bir tablo ve sütunda bir JSON indeksi oluşturur.
JSON dizinleri:
- Tabloda veri olmadan önce oluşturulabilir.
- Başka bir veritabanındaki tablolarda, nitelikli bir veritabanı adı belirterek oluşturulabilir.
- Tablonun kümelenmiş bir birincil anahtara sahip olmasını zorunlu tutun.
- Dizinli görünümlerde belirtilemiyor.
Uyarı
JSON indeksleri oluşturma şu anda önizleme aşamasında olup yalnızca SQL Server 2025 (17.x) sürümlerinde mevcuttur.
Transact-SQL söz dizimi kuralları
Sözdizimi
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 }
}
Tartışmalar
endeks_adı
Dizinin adı. Dizin adlarının bir tablo içinde benzersiz olması gerekir, ancak veritabanında benzersiz olması gerekmez. Dizin adları tanımlayıcıların kurallarına uymalıdır.
ON <nesnesi> ( json_column_name )
Dizinin oluşturulacağı nesneyi (veritabanı, şema veya tablo) ve json sütununun adını belirtir.
json_column_name
içinde belirtilen SQL/JSON yollarından sıfır veya daha fazlasını içeren json veri türü
table_namesütununun adı.sql_json_path
dosyasından
json_column_nameayıklanması ve dizine alınması gereken SQL/JSON yolu. içinsql_json_pathvarsayılan değeridir$.- Belirtilen yoldan ileriye doğru tüm anahtarları/değerleri yinelemeli olarak dizine alır.
- JSON belge yolunda en fazla 128 düzeyi destekler.
- Çakışmaya izin vermez.
Örneğin,
$.ave$.a.bbir hataya neden olur, çünkü yol$.aözyinelemeli olarak tüm yolları içeriyor ve kullanıcı amacı belirsiz.
ON filegroup_name
Belirtilen dosya grubunda belirtilen dizini oluşturur. Konum belirtilmezse ve tablo bölümlenmemişse, dizin temel tabloyla aynı dosya grubunu kullanır. Dosya grubu zaten var olmalıdır.
ON "varsayılan"
Varsayılan dosya grubunda belirtilen dizini oluşturur.
Bu bağlamda varsayılan terimi bir anahtar sözcük değildir. Varsayılan dosya grubu için bir tanımlayıcıdır ve veya ON "default"içinde ON [default] olduğu gibi sınırlandırılmalıdır. belirtilirse "default" , QUOTED_IDENTIFIER seçeneği geçerli oturum için olmalıdır ON . Bu varsayılan ayardır. Daha fazla bilgi için bkz. SET QUOTED_IDENTIFIER.
<nesne>:: =
Dizine eklenecek tam ya da kısmen nitelenmiş nesne.
database_name
Veritabanının adı.
schema_name
Tablonun ait olduğu şemanın adı.
table_name
Dizine eklenecek tablonun adı.
OPTIMIZE_FOR_ARRAY_SEARCH = { ON | KAPALI }
Dizi aramalarının JSON dizininde iyileştirilmiş olup olmadığını belirtir. Varsayılan değer: OFF.
FILLFACTOR = FILLFACTOR
Veritabanı Altyapısı'nın dizin oluşturma veya yeniden oluşturma sırasında her dizin sayfasının yaprak düzeyini ne kadar tam yapması gerektiğini gösteren bir yüzde belirtir.
fillfactor, 1 ile 100 arasında bir tamsayı değeri olmalıdır. Varsayılan değer: 0. Eğer fillfactor100 veya 0 ise, Veritabanı Altyapısı yaprak sayfaların kapasitesi dolu olacak şekilde dizinler oluşturur.
Uyarı
Doldurma faktörü değerleri 0 ve 100 her açıdan aynıdır.
FILLFACTOR ayarı yalnızca dizin oluşturulduğunda veya yeniden oluşturulduğunda uygulanır. Veritabanı Altyapısı, sayfalarda belirtilen boş alan yüzdesini dinamik olarak tutmaz. Doldurma faktörü ayarını görüntülemek için sys.indexes katalog görünümünü kullanın.
Veritabanı Motoru, FILLFACTOR100'den küçük olacak şekilde bir kümelenmiş dizin oluşturduğunda verileri yeniden dağıttığından, bu dizinle verilerin kapladığı depolama alanı miktarını etkiler.
Daha fazla bilgi için bkz. Diziniçin Dolgu Faktörü Belirtme.
DROP_EXISTING = { ON | KAPALI }
Adlandırılmış, önceden var olan JSON dizininin bırakıldığını ve yeniden derlendiğini belirtir. Varsayılan değer: OFF.
AÇIK
Mevcut dizin bırakılır ve yeniden oluşturulur. Belirtilen dizin adı şu anda var olan bir dizinle aynı olmalıdır; ancak dizin tanımı değiştirilebilir. Örneğin, farklı sütunlar, sıralama düzeni, bölüm düzeni veya dizin seçenekleri belirtebilirsiniz.
KAPALI
Belirtilen dizin adı zaten varsa bir hata görüntülenir.
Dizin türü DROP_EXISTING kullanılarak değiştirilemez.
ÇEVRİMİÇİ = KAPALI
Dizin işlemi sırasında sorgular ve veri değişiklikleri için temel tabloların ve ilişkili dizinlerin kullanılamadığını belirtir. SQL Server'ın bu sürümünde, JSON dizinleri için çevrimiçi dizin derlemeleri desteklenmez. Bu seçenek bir JSON dizini için ON olarak ayarlanırsa bir hata tetiklenir.
ONLINE seçeneğini atlayın veya ONLINE'i OFF olarak ayarlayın.
JSON dizini oluşturan, yeniden oluşturan veya düşüren çevrimdışı bir dizin işlemi, tabloda şema değişikliği (Sch-M) kilidi alır. Bu, işlem süresi boyunca temel alınan tabloya tüm kullanıcı erişimini engeller.
Çevrimiçi dizin işlemleri SQL Server'ın her sürümünde kullanılamaz.
Windows'da SQL Server sürümleri tarafından desteklenen özelliklerin listesi için bkz:
- SQL Server 2025'in sürümleri ve desteklenen özellikleri
- SQL Server 2022'nin Sürümleri ve desteklenen özellikleri
- SQL Server 2019'nin
Sürümleri ve desteklenen özellikleri - SQL Server 2017'nin Sürümleri ve desteklenen özellikleri
- SQL Server 2016'nın Sürümleri ve desteklenen özellikleri
ALLOW_ROW_LOCKS = { ON | KAPALI }
Satır kilitlerine izin verilip verilmeyeceğini belirtir. Varsayılan değer: ON.
AÇIK
Dizine erişirken satır kilitlerine izin verilir. Veritabanı Altyapısı satır kilitlerinin ne zaman kullanılacağını belirler.
KAPALI
Satır kilitleri kullanılmaz.
ALLOW_PAGE_LOCKS = { ON | KAPALI }
Sayfa kilitlerine izin verilip verilmeyeceğini belirtir. Varsayılan değer: ON.
AÇIK
Dizine erişirken sayfa kilitlerine izin verilir. Veritabanı Altyapısı, sayfa kilitlerinin ne zaman kullanılacağını belirler.
KAPALI
Sayfa kilitleri kullanılmaz.
MAXDOP = max_degree_of_parallelism
max degree of parallelism Dizin işlemi süresi boyunca yapılandırma seçeneğini geçersiz kılar. Paralel plan yürütmesinde kullanılan işlemci sayısını sınırlamak için kullanın MAXDOP . Maksimum değer 64 işlemcidir.
Önemli
Syntaktik olarak desteklenmesine rağmen, MAXDOP şu anda her zaman yalnızca tek bir işlemci kullanır.
max_degree_of_parallelism aşağıdaki değerlerden biri olabilir.
| Değer | Açıklama |
|---|---|
1 |
Paralel plan oluşturmayı bastırır. |
>1 |
Paralel dizin işleminde kullanılan işlemci sayısı üst sınırını, geçerli sistem iş yüküne göre belirtilen sayıda veya daha az işlemciyle kısıtlar. |
0 (varsayılan) |
Geçerli sistem iş yüküne göre gerçek işlemci sayısını veya daha azını kullanır. |
Daha fazla bilgi için bkz . Paralel dizin işlemlerini yapılandırma.
Paralel dizin işlemleri SQL Server'ın her sürümünde kullanılamaz.
Windows'da SQL Server sürümleri tarafından desteklenen özelliklerin listesi için bkz:
- SQL Server 2025'in sürümleri ve desteklenen özellikleri
- SQL Server 2022'nin Sürümleri ve desteklenen özellikleri
- SQL Server 2019'nin
Sürümleri ve desteklenen özellikleri - SQL Server 2017'nin Sürümleri ve desteklenen özellikleri
- SQL Server 2016'nın Sürümleri ve desteklenen özellikleri
DATA_COMPRESSION = { YOK | SATIR | SAYFA }
Dizin tarafından kullanılan veri sıkıştırma düzeyini belirler.
Hiç kimse
Dizin tarafından veriler üzerinde sıkıştırma kullanılmaz
ROW
Dizin tarafından veriler üzerinde kullanılan satır sıkıştırma
SAYFA
Dizin tarafından verilerde kullanılan sayfa sıkıştırma
Açıklamalar
CREATE JSON INDEX deyimi başına her seçenek yalnızca bir kez belirtilebilir. Herhangi bir seçeneğin yinelenmesi hataya neden olur.
[ ON { filegroup_name | "default" } ]
JSON dizini için bir dosya grubu belirtirseniz dizin, tablonun bölümleme düzeninden bağımsız olarak bu dosya grubuna yerleştirilir.
Dizin oluşturma hakkında daha fazla bilgi için CREATE INDEX bölümündeki Açıklamalar bölümüne bakın.
JSON diziniyle desteklenen koşul
Bir tablodaki json sütununda yer alan JSON belgelerinde yapılan arama işlemleri, json sütununda bir JSON dizini varsa en iyi duruma getirilebilir. JSON dizini, çeşitli JSON işlev tabanlı ifadelere sahip sorgularda kullanılır.
Aşağıdaki örnekler, Sales.SalesOrderHeader veritabanındaki AdventureWorks2025 tablosunda, adlı bir json sütunu olan Info kullanılarak yapılır. Sütun Info bir json türü olarak oluşturulur. Varsayılan ayarlara sahip bir JSON dizini, Info sütununda da oluşturulur. Aşağıdaki kod örneği deyimini CREATE JSON INDEX gösterir:
CREATE JSON INDEX sales_info_idx
ON Sales.SalesOrderHeader (Info);
Örnek arama ifadeleri için veri olarak aşağıdaki JSON belgelerini kullanın:
| Satış Sipariş Numarası | Bilgi |
|---|---|
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 işlevi
JSON belgesinde belirtilen bir SQL/JSON yolunun olup olmadığını test etmek için JSON_PATH_EXISTS işlevini kullanın.
Bu sorgu, JSON_PATH_EXISTS dizini kullanılarak iyileştirilebilen bir json sütununda gösterilir:
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE JSON_PATH_EXISTS(Info, '$.Order.IsProcessed') = 1;
JSON dizini, JSON_PATH_EXISTS özelliği ve aşağıdaki işleçlerle desteklenir:
- Karşılaştırma işleçleri (
=) -
IS [NOT] NULLkoşul (Şu anda desteklenmiyor)
JSON_VALUE işlevi
JSON belgesinde belirtilen SQL/JSON yolundaki JSON metnini / skaler değerini ayıklamak için JSON_VALUE kullanın. Aşağıdaki sorgular, json sütunundaki bir JSON_VALUEifadenin JSON dizini kullanılarak nasıl iyileştirilebileceğini gösterir.
Nesne özelliğinde JSON dizesi için eşitlik araması:
SELECT COUNT(*) FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.Type') = 'IN';Değeri int veri türüne dönüştürdükten sonra nesne özelliğinde JSON numarası için eşitlik araması yapın:
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) = 16167;Değeri int veri türüne dönüştürdükten sonra nesne özelliğinde JSON numarası için aralık araması yapın:
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) IN (16167, 16517);Değeri ondalık veri türüne dönüştürdükten sonra nesne özelliğinde JSON numarası için aralık araması yapın:
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Order.TotalDue RETURNING decimal(20, 4)) BETWEEN 1000 and 2000;
JSON dizini bir JSON_VALUE koşul ve aşağıdaki işleçlerle desteklenir:
- Karşılaştırma işleçleri (
=) -
LIKEkoşul (şu anda desteklenmiyor) -
IS [NOT] NULLkoşul (şu anda desteklenmiyor)
JSON_CONTAINS işlevi
JSON_CONTAINS işlevi, JSON sütununda varsa JSON dizini kullanabilen bir JSON belgesinde JSON değerlerinin kolayca aranabilmesini destekler. Bu işlev bir JSON skaler değeri, nesnesi veya dizisinin bir JSON belgesinde belirtilen SQL/JSON yolunda bulunup bulunmadiğini test etmek için kullanılabilir. SQL skaler türleri olarak belirtilen arama değerleri, mevcut SQL/JSON tür dönüştürmeleri uyarınca dönüştürülür. Bu kurallar davranış bölümünde tanımlanır.
Gereksinim
JSON sütununu içeren tabloda kümeleme anahtarı gereklidir. Kümeleme anahtarı yoksa bir hata oluşur. Kümeleme anahtarı 31 sütunla sınırlıdır ve dizin anahtarının en büyük boyutu 128 bayttan az olmalıdır.
İzinler
Kullanıcının tabloda ALTER izni olmalı ya da sysadmin sabit sunucu rolünün, db_ddladmin ve db_owner sabit veritabanı rollerinin üyesi olmalıdır.
Sınırlamalar
JSON dizin deyimi için aşağıdaki sınırlamalar vardır:
- Tablodaki bir json sütununda yalnızca bir JSON dizini oluşturulabilir.
- Tabloda en fazla 249 JSON dizini oluşturabilirsiniz. Belirli bir JSON sütununda birden fazla JSON dizini oluşturulması desteklenmez.
- Hesaplanan json sütunlarında JSON dizini oluşturulamaz.
- JSON dizini, bir görünümde, tablo değerli bir değişkende veya bellek optimize edilmiş bir tablodaki json sütunlarında oluşturulamaz.
- JSON dizini yalnızca çevrimdışı bir şekilde oluşturulabilir veya değiştirilebilir.
- JSON yolları dizin tanımında çakışamaz. Örneğin,
$ave$a.börtüşür ve bu durumCREATE JSON INDEXifadesinde izin verilmez. - Yolların değiştirilmesi, JSON dizininin yeniden oluşturulmasını gerektirir.
- JSON dizinleri dizin ipuçlarında desteklenmez.
- Veri sıkıştırma seçeneği desteklenmez.
Örnekler
A. Bir JSON sütununda JSON dizini oluşturma
Aşağıdaki örnek, docs adlı bir tablo oluşturur ve bu tablo adlı bir sütun içerir. Sütun, content türündedir. Örnek daha sonra json_content_index sütunu üzerinde content bir JSON dizini oluşturur. Örnek, JSON belgesinin tamamında veya JSON belgesindeki tüm SQL/JSON yollarında json dizinini oluşturur.
DROP TABLE IF EXISTS docs;
CREATE TABLE docs
(
content JSON,
id INT PRIMARY KEY
);
CREATE JSON INDEX json_content_index
ON docs (content);
A. Belirli yollara sahip bir JSON sütununda JSON dizini oluşturma
Aşağıdaki örnek, docs adlı bir tablo oluşturur ve bu tablo adlı bir sütun içerir. Sütun, content türündedir. Örnek daha sonra json_content_index sütunu üzerinde content bir JSON dizini oluşturur. Örnek, JSON belgesindeki belirli SQL/JSON yollarında JSON dizinini oluşturur.
Örnek ayrıca FILLFACTOR dizinini 80 olarak ayarlar.
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. Dizi arama iyileştirmesi ile JSON dizini
Aşağıdaki örnek, tablosu dbo.Customersiçin JSON dizinlerini döndürür. JSON dizini, dizi arama iyileştirme seçeneği etkin olarak oluşturulur.
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');