EF Core 11 ile iç içe complex type'larda indeks kullanımı
EF Core 11 RC1, complex type'ların içindeki özelliklere doğrudan EF modelinden indeks tanımlamayı mümkün kılıyor. Yazar, Npgsql ile PostgreSQL üzerinde bu indekslerin sorgu planlarını ve JSON kolonlarındaki sınırlamaları ölçümlerle inceliyor. Veri modelini tasarlayan .NET geliştiricileri için pratik bir kılavuz.
Kilit noktalar
- HasIndex ile complex type içindeki özellikler (örn. g.Summary.Leader.PlayerId) doğrudan indekslenebilir; kolonlara eşlenmiş olmaları gerekir.
- Bileşik indeksler (örn. Victory.Kind ve Leader.Score) hem filtreyi hem sıralamayı karşılayabilir.
- JSON kolonundaki koleksiyon içindeki özelliklere yapılan indeksler RC1'de tüm Board kolonu üzerinde oluşur, kullanışlı değildir.
- Koleksiyon içeren complex type'ların ToJson() ile eşlenmesi gerekir; kök tip de JSON olmalıdır.
- Union tipleri RC1'de eşlenemez; closed hierarchy'ler düz bir DTO'ya dönüştürülerek çözülebilir.
- Bu sorgular için GIN indeks, 20.000 kayıtta yaklaşık 15 kat hız kazandırdı, ancak planlayıcı her zaman seçmiyor.
EF Core 11 RC1 ile complex type'ların iç içe özelliklerine, HasIndex çağrısıyla doğrudan model üzerinden indeks tanımlanabiliyor. Örnek olarak bir oyun durumunun lider oyuncu bilgisi gibi kolonlara eşlenmiş özellikler için oluşturulan indeksler, Npgsql üzerinde PostgreSQL'in gerçekten kullandığı indekslere dönüşüyor ve sorgular bu sayede hızlanıyor.
Ancak JSON kolonuna eşlenmiş koleksiyonların içine yapılan indeksler şu an için işe yaramıyor; sağlayıcı bu indeksleri kolonun tamamı üzerinde oluşturuyor. Yazar, koleksiyon sorgusu için bunun yerine PostgreSQL'e özgü bir GIN indeksini elle yazılmış migration ile eklemeyi ve bunun planlayıcı tercihine bağlı olduğunu gösteriyor. Union ve kapalı hiyerarşi tiplerinin desteklenmediği durumlarda uygulanabilecek dönüşüm yollarını da ele alıyor.
Gerçek dünyada kullanımı
- Oyun, sipariş veya yapılandırma kayıtlarını veritabanında saklayan ve iç içe value object'lerle filtreleme yapan bir uygulama.
- Bir oyuncunun lider olduğu kayıtları ya da belirli bir koşula uyan kayıtları sıralı getiren liste ekranları.
- JSON kolonunda tutulan koleksiyonlar üzerinde sorgu yazan ve performansını ölçmek isteyen bir ekip.
Neden önemli
Value object'leri kolonlara eşlerseniz EF Core 11 ile bu alanları doğrudan modelden indeksleyebilirsiniz. JSON içindeki koleksiyon sorguları için ise sağlayıcı desteğini ve EXPLAIN çıktısını yeniden kontrol etmeniz gerekir.