Aracılığıyla paylaş


JSON İNDEKSİ OLUŞTUR (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2025 (17.x) Önizlemesi

SQL Server 2025 (17.x) Preview'da belirtilen tablo ve sütunda JSON dizini 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 dizinleri oluşturma şu anda önizleme aşamasındadır ve yalnızca SQL Server 2025 (17.x) Önizleme sürümünde kullanılabilir.

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> ::=
{
    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_name sütununun adı.

  • sql_json_path

    dosyasından json_column_nameayıklanması ve dizine alınması gereken SQL/JSON yolu. için sql_json_path varsayı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, $.a ve $.a.b bir 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.

<object>:: =

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ı.

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 uzamsal dizinin bırakılıp yeniden inşa edildiğ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:

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 İş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:

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 AdventureWorks2022 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] NULL koş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 (=)
  • LIKE koşul (şu anda desteklenmiyor)
  • IS [NOT] NULL koş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, $a ve $a.b örtüşür ve bu durum CREATE JSON INDEX ifadesinde 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);