Merhaba,
Bu makalede SQL Server üzerinde Json türündeki veriler üzerinde hızlı arama gerçekleştirmek için nasıl indexleme yapacağımızı öğreneceğiz.
Bildiğimiz gibi Json türündeki veriler aslında string ifadeler olup SQL Server üzerinde NVARCHAR(Max) olarak tutabildiğimiz verilerdir.
Json kullanmanın en büyük avantajı bir alanda yapısal formatta olmasına gerek olmayan ve ileride daha fazla ve farklı bilgiyi de tutmak istediğimizde veritabanının yapısında değişiklik yapmaya gerek olmamasıdır.
Örneğin bir ürün listesinde bir ürünün özellikleri içinde kullanılan kapağın materyal bilgisi varken diğerinde olmasına gerek yoktur. Ekler gidersiniz. Sorgulamak istediğinizde de sadece olanları getirebilirsiniz.
Peki, SQL Server’da Json formatındaki bir veriyi nasıl sorgularız?
SQL Server’da native T-SQL ile kullanabileceğimiz Json komutları aşağıdaki gibidir.
SELECT – FOR Clause
Bir sorgunun çıktısını JSON formatında döndürmek için kullanılır.
Örnek:
SELECT * FROM TableName FOR JSON AUTO;
TableName verilerini JSON formatında döndürür.
OPENJSON
JSON verilerini SQL Server tablolarına dönüştürür (parçalar ve satırlar/sütunlar olarak sunar).
Örnek:
SELECT * FROM OPENJSON('{"id":1, "name":"John"}');
JSON’u tablosal bir formatta döndürür: key, value, type.
JSON Fonksiyonları
Ne işe yarar? JSON verileriyle çalışmayı kolaylaştıran çeşitli fonksiyonlar içerir:
JSON_VALUE()
JSON içindeki bir anahtarın değerini döndürmek için kullanılır. Sadece düz (scalar) değerleri döndürebilir (örneğin, sayı veya metin).
Örnek:
SELECT JSON_VALUE('{"id":1, "name":"John"}', '$.name') AS Name;
Özellikler:
Path: İlgili değerin bulunduğu JSON yolu ($) belirtilir.
Sadece metin, sayı gibi düz değerleri döndürebilir, nesne veya dizi döndürmek için kullanılmaz.
JSON_QUERY()
JSON içindeki bir alt nesne veya dizi gibi daha karmaşık verileri döndürmek için kullanılır.
Örnek:
SELECT JSON_QUERY('{"id":1, "details":{"age":30, "city":" Newyork "}}', '$.details') AS Details;
Çıktı: {“age”:30, “city”:”Newyork”}
Özellikler:
Dizi (array) veya nesne (object) döndürmek için kullanılır.
Düz değerler için kullanılamaz, bunun yerine JSON_VALUE() tercih edilir.
JSON_MODIFY()
JSON verisini güncellemek, bir değeri değiştirmek veya yeni bir değer eklemek için kullanılır.
Örnek:
SELECT JSON_MODIFY('{"id":1, "name":"John"}', '$.name', 'Jane') AS UpdatedJson;
Çıktı: {“id”:1, “name”:”Jane”}
Özellikler:
Belirtilen JSON yolundaki değeri değiştirir.
Yeni bir anahtar eklemek için kullanılabilir.
Mevcut bir anahtarı silmek için kullanılabilir (NULL atayarak).
Kısa Özet:
JSON_VALUE(): Scalar değerleri almak için,
JSON_QUERY(): Alt nesneler veya dizileri almak için,
JSON_MODIFY(): JSON verisini güncellemek, eklemek veya silmek için kullanılır.
ISJSON
Bir metnin geçerli bir JSON olup olmadığını kontrol eder.
Örnek:
SELECT ISJSON('{"key":"value"}') AS IsValidJSON; -- 1 döner
Geçerli JSON ise 1, değilse 0 döndürür.
JSON_OBJECT (Transact-SQL)
Anahtar-değer çiftlerinden bir JSON nesnesi oluşturur.
Örnek:
SELECT JSON_OBJECT('id', 1, 'name', 'John') AS JsonObject;
Çıktı: {“id”:1, “name”:”John”}
JSON_ARRAY
JSON formatında bir dizi (array) oluşturur.
Örnek:
SELECT JSON_ARRAY(1, 'John', 3.14) AS JsonArray;
Çıktı: [1, “John”, 3.14]
Bu komutlar sayesinde SQL Server’da JSON verilerini oluşturabilir, düzenleyebilir, sorgulayabilir ve doğrulayabiliriz. JSON desteği, hem uygulamalarla entegrasyonu kolaylaştırır hem de yapılandırılmamış verilerle çalışmayı verimli hale getirir.
Şimdi gelelim Json içeren bir veride arama yaparken ihtiyacımız olan index kullanımına.
Şimdi elimizde bu şekilde bir veriseti var. 75.959 satır ve Json verisi örnek olarak bu şekilde.
{"Product_Name": "Dell Optiplex Micro 7010MFF Plus", "Category": "Mini Desktop", "Description": "The Dell Optiplex Micro 7010MFF Plus is a powerful mini desktop computer featuring Intel Core i5 13500T processor, 32GB DDR5 RAM, and 4TB SSD storage. It runs on Windows 11 Home operating system and comes in black color. This mini desktop PC is designed for professional use and offers wireless features, Bluetooth connectivity, and Intel UHD Graphics 770.", "Color": "Black", "Operating System": "Windows 11 Home", "Graphics Card Type": "Internal Video Card", "Ram Type": "DDR5", "Processor Number": "13500T", "Wireless Feature": "Yes", "Bluetooth": "Yes"}
Burada ATTRIBUTES alanı json formatında ve NVARCHAR(MAX) olarak tutuluyor.
Şimdi biz burada json içinde Product_Name özelliği ‘Dell%’ ile başlayan ürünleri getirmek istersek, bu şekilde bir sorgu yazarız. Burada JSON_VALUE fonksiyonunu kullanıyoruz.
Görüldüğü gibi 247 satır veri geldi.
Şimdi execution plana ve okuma sayısına bakalım.
Görüldüğü gibi clustered index scan yapıyor yani tüm tabloyu tarıyor ve toplam okuduğu page sayısı 46781. Bu da her bir page 8 KB olduğuna göre, yaklaşık 365 MB’lık bir okumaya tekabül ediyor.
Şimdi bu Json verisine index koymayı deneyelim.
Json verisi bir text veri olduğu için doğrudan bir index koyamıyoruz. Ancak burada bir computed alan ekleyerek bu alana index koyabiliyoruz.
Örneğin biz burada Json içinde Product_Name bilgisini indexlemek istersek,
Tabloya bir alan ekleyebiliriz. Bu alan bir computed alan olur ve Json içinde Product_Name değerini otomatik olarak alır.
ALTER TABLE WEBITEMS
ADD Json_PRODUCTNAME AS JSON_VALUE(ATTRIBUTES,'$.Product_Name')
Sonra bu alana bir index ekleriz.
CREATE INDEX IX_JSON_PRODUCTNAME
ON WEBITEMS(Json_PRODUCTNAME)
Şimdi sorgu performansımıza bakalım. Görüldüğü gibi bu kez doğru indexi buldu ve okuma sayısı 46781’den 771’e düştü. Yaklaşık 60 katlık bir performans artışı.
Burada ayrıca eklemiş olduğumuz hesaplanmış alanı da olduğu gibi kullanabiliriz.
Sonuç:
Bu makalede Json türündeki verilerin SQL Server’da NVARCHAR(max) olarak tutulduğunda nasıl sorgulanacağını ve Json türündeki verilerin nasıl indexleneceğini öğrenmiş olduk.
Başka bir makalede görüşmek dileğiyle…