Performansa Giriş

Veritabanı performansı, tüm bileşen yığınını kapsayan geniş ve karmaşık bir konudur: veritabanı, ağ, veritabanı sürücüsü ve EF Core gibi veri erişim katmanları. EF Core gibi üst düzey katmanlar ve O/RM'ler uygulama geliştirmeyi önemli ölçüde basitleştirir ve sürdürülebilirliği artırırken, bazen opak olabilir ve yürütülmekte olan SQL gibi performans açısından kritik iç ayrıntıları gizler. Bu bölümde EF Core ile iyi performans elde etme ve uygulama performansını düşürebilecek yaygın tuzaklardan kaçınma hakkında genel bir bakış sağlamaya çalışılıyor.

Darboğazları tanımla ve ölç, ölç, ölç

Her zaman performansta olduğu gibi, verilerin bir sorun göstermeden iyileştirmeye acele etmemesi önemlidir; Büyük Donald Knuth'un dediği gibi, "Erken iyileştirme tüm kötülüklerin köküdür". Performans tanılama bölümü, uygulamanızın veritabanı mantığında nerede zaman geçirdiğini ve belirli sorunlu alanları nasıl belirleyebileceğinizi anlamanın çeşitli yollarını açıklar. Yavaş bir sorgu belirlendikten sonra çözümler göz önünde bulundurulabilir: Veritabanınızda dizin eksik mi? Diğer sorgulama desenlerini denemeli misiniz?

Kodunuzu ve olası alternatifleri her zaman kendiniz kıyaslayın- Performans tanılama bölümünde BenchmarkDotNet ile örnek bir karşılaştırma yer alır ve bu karşılaştırmaları kendi karşılaştırmalarınız için şablon olarak kullanabilirsiniz. Genel, genel karşılaştırmaların özel kullanım örneğine as-is uygulandığını varsaymayın; veritabanı gecikme süresi, sorgu karmaşıklığı ve tablolarınızdaki gerçek veri tutarları gibi çeşitli faktörler, çözümün en iyi olduğu konuda derin bir etkiye sahip olabilir. Örneğin, birçok genel karşılaştırma, veritabanına gecikme süresinin neredeyse sıfır olduğu ideal ağ koşullarında ve veritabanı tarafında neredeyse hiç işlem (veya disk G/Ç) gerektirmeyen son derece hafif sorgularla gerçekleştirilir. Bunlar farklı veri erişim katmanlarının çalışma zamanı ek yüklerini karşılaştırmak için değerli olsa da, ortaya çıkardıkları farklılıkların genellikle veritabanının gerçek çalışma ve veritabanı gecikmesi gerçekleştirdiği gerçek bir uygulamada göz ardı edilebilir olduğu kanıtlanır ve bu durum önemli bir performans faktörüdür.

Veri erişim performansının yönleri

Genel veri erişim performansı aşağıdaki geniş kategorilere ayrılabilir:

  • Saf veritabanı performansı. İlişkisel veritabanı ile EF, uygulamanın LINQ sorgularını veritabanı tarafından yürütülen SQL deyimlerine çevirir; bu SQL deyimleri daha fazla veya daha az verimli çalışabilir. Doğru yerde doğru dizin, SQL performansında bir dünya fark oluşturabilir veya LINQ sorgunuzu yeniden yazmak EF'in daha iyi bir SQL sorgusu oluşturmasını sağlayabilir.
  • Ağ veri aktarımı. Herhangi bir ağ sisteminde olduğu gibi, kabloda ileri geri giden veri miktarını sınırlamak önemlidir. Bu, yalnızca ihtiyacınız olacak verileri gönderip yüklediğinizden emin olmakla birlikte ilgili varlıkları yüklerken "kartezyen patlama" etkisinden kaçınmanızı kapsar.
  • Ağ gidiş dönüşleri. Uygulamanızla veritabanınız arasında gidip gelen paketlerin süresi, veritabanında bir sorgunun yürütülmesi için geçen süreden daha uzun olabilir, ve ileriveri giden veri miktarının ötesinde, ağ gidiş dönüş süreleri bu nedenle kritik bir rol oynayabilir. Gidiş dönüş ek yükü büyük ölçüde ortamınıza bağlıdır; Veritabanı sunucunuz ne kadar uzakta olursa, gecikme süresi o kadar yüksek olur ve her gidiş dönüş için daha maliyetli olur. Bulutun ortaya çıkmasıyla birlikte, uygulamalar kendilerini veritabanından daha da uzakta buluyor ve çok sayıda iletişim kuran "chatty" uygulamalar performans düşüklüğüne yol açıyor. Bu nedenle, uygulamanızın veritabanına ne zaman başvurduğunu, kaç gidiş dönüş gerçekleştirdiğini ve bu sayın en aza indirilip küçültülemeyeceğini anlamak önemlidir.
  • EF çalışma zamanı ek yükü. Son olarak, EF veritabanı işlemlerine biraz çalışma zamanı yükü ekler: EF'in sorgularınızı LINQ'ten SQL'e derlemesi gerekir (normalde yalnızca bir kez yapılması gerekir), değişiklik izleme biraz ek yük ekler (ancak devre dışı bırakılabilir). Uygulamada, veritabanındaki sorgu yürütme süresi ve ağ gecikme süresi toplam süreye hakim olduğundan, gerçek dünya uygulamaları için EF ek yükü çoğu durumda göz ardı edilebilir; ancak seçeneklerinizin ne olduğunu ve bazı tuzaklardan nasıl kaçındığınızı anlamak önemlidir.

Arka planda neler olduğunu öğrenme

EF, geliştiricilerin SQL oluşturarak, sonuçları gerçekleştirerek ve diğer görevleri gerçekleştirerek iş mantığına odaklanmasını sağlar. Her katman veya soyutlamada olduğu gibi, yürütülen gerçek SQL sorguları gibi, arka planda gerçekleşenleri gizleme eğilimindedir. Performans, her uygulamanın önemli bir yönü olmayabilir, ancak bulunduğu uygulamalarda geliştiricinin EF'nin onlar için ne yaptığını anlaması çok önemlidir: giden SQL sorgularını inceleyin, N+1 sorununun oluşmadığından emin olmak için gidiş dönüşleri izleyin vb.

Veritabanının dışında önbellek

Son olarak, bir veritabanıyla etkileşim kurmanın en verimli yolu, veritabanıyla hiç etkileşim kurmamaktır. Başka bir deyişle, veritabanı erişimi uygulamanızda performans sorunu olarak görünüyorsa, istekleri en aza indirmek için belirli sonuçları veritabanının dışında önbelleğe almak faydalı olabilir. Önbelleğe alma karmaşıklık katsa da, ölçeklenebilir uygulamaların özellikle önemli bir parçasıdır: Artan yükü işlemek için ek sunucular eklenerek uygulama katmanı kolay ölçeklendirilebileceğinden, veritabanı katmanını ölçeklendirmek genellikle çok daha karmaşıktır.