Kısacası, CTO'nuza katılıyorum. Muhtemelen ölçeklenebilirlik pahasına bir miktar performans kazandınız (eğer bu terimler kafa karıştırıcıysa, aşağıda açıklayacağım). En büyük iki endişem, sürdürülebilirlik ve yatay ölçeklendirme seçeneklerinin olmaması (buna ihtiyacınız olacağını varsayarak) olacaktır.
Verilere yakınlık: Bir adım geri gidelim. Bir DB içine kod itmek için bazı iyi nedenler vardır. En büyüğünün verilere yakınlık olacağını iddia ediyorum - örneğin, bir hesaplamanın bir avuç değer döndürmesini bekliyorsanız, ancak bunlar milyonlarca kayıt (talep üzerine) göndererek milyonlarca kayıt toplanıyor başka bir yerde toplanacak olan ağ son derece israflıdır ve sisteminizi kolayca öldürebilir. Bunu söyledikten sonra, verilerin bir kısmına, başka bir yolla, esas olarak, toplamanın bir kısmının önceden yapıldığı önbellekleri veya analiz DB'lerini kullanarak ulaşabilirsiniz.
Kodun DB'deki performansı:"İcra planlarının önbelleğe alınması" gibi ikincil performans etkilerinin tartışılması daha zordur. Bazen, yanlış yürütme planı önbelleğe alınmışsa, önbelleğe alınmış yürütme planları çok olumsuz bir şey olabilir. RDBMS'nize bağlı olarak, bunlardan en iyi şekilde yararlanabilirsiniz, ancak çoğu durumda parametreli SQL'den fazla bir şey elde edemezsiniz (bu planlar da genellikle önbelleğe alınır). Ayrıca en derlenmiş veya JIT'ed dillerinin genellikle temel işlemler ve ilişkisel olmayan programlama (dize manipülasyonu, döngüler, vb.) İçin SQL eşdeğerlerinden (T-SQL veya PL / SQL gibi) daha iyi performans gösterdiğini iddia ediyorum. Sayıda çatırtı yapmak için Java veya C # gibi bir şey kullandıysanız, orada hiçbir şey kaybetmeyin. İnce taneli optimizasyon da oldukça zordur - DB'de, genellikle tek veri yapınız olarak genel bir B-ağacı (dizin) ile takılır. Adil olmak gerekirse, daha uzun süren işlemlere sahip olma, kilit yükseltme vb. Gibi tam bir analiz, kitapları doldurabilir.
Sürdürülebilirlik: SQL, yapmak için tasarlandığı harika bir dildir. Bunun uygulama mantığına çok uygun olduğundan emin değilim. Hayatımızı katlanılabilir kılan araç ve uygulamaların çoğunu (TDD, refactoring, vb.) Veritabanı programlamaya uygulamak zordur.
Performans ve ölçeklenebilirlik karşılaştırması:Bu terimleri açıklığa kavuşturmak için şunu kastediyorum: performans, düşük yük olduğu varsayılırken, tek bir isteğin sisteminizden geçmesini (ve kullanıcıya geri dönmesini) ne kadar hızlı beklediğinizdir. Bu genellikle geçtiği fiziksel katman sayısı, bu katmanların ne kadar iyi optimize edildiği vb. İle sınırlı olacaktır. Ölçeklenebilirlik, artan kullanıcı / yük ile performansın nasıl değiştiğidir. Orta / düşük performansa sahip olabilirsiniz (örneğin, bir istek için 5 saniye +), ancak harika ölçeklenebilirlik (milyonlarca kullanıcıyı destekleyebilir) olabilir. Sizin durumunuzda, muhtemelen iyi bir performans yaşayacaksınız, ancak ölçeklenebilirliğiniz, bir sunucunun fiziksel olarak ne kadar büyük oluşturabileceğiyle sınırlandırılacaktır. Bir noktada, bu sınıra vuracak ve uygulamanın doğasına bağlı olarak mümkün olmayabilecek parçalanma gibi şeylere yönelmek zorunda kalacaksınız.
Erken Optimizasyon: Sonuçta, zamanından önce optimizasyon hatası yaptığınızı düşünüyorum. Diğerlerinin de belirttiği gibi, diğer yaklaşımların nasıl çalışacağını gösteren ölçümleriniz yok. Bir teoriyi kanıtlamak veya çürütmek için her zaman tam ölçekli prototipler oluşturamayız ... Ama genel olarak, performans için sürdürülebilirliği (muhtemelen uygulamanın en önemli kalitesini) gören bir yaklaşım seçmekte her zaman tereddüt ederdim. .
EDIT: Olumlu bir not, dikey ölçekleme bazı durumlarda oldukça uzayabilir. Bildiğim kadarıyla, SO oldukça uzun bir süre tek bir sunucu üzerinde koştu. 10.000 kullanıcınızla nasıl eşleştiğinden emin değilim (sanırım sisteminizde ne yaptıklarının doğasına bağlı olacaktır), ancak size ne yapılabileceği hakkında bir fikir verir (aslında, çok uzak daha etkileyici örnekler, bu sadece insanların kolayca anlayabileceği popüler bir şeydir).
DÜZENLEME 2: Başka yerlerde gündeme getirilen birkaç şeyi açıklığa kavuşturmak ve yorum yapmak için:
- Re: Atomik tutarlılık - ASİT tutarlılığı sistemin bir zorunluluğu olabilir. Yukarıdakiler buna karşı değildir ve ASID tutarlılığının tüm iş mantığınızı DB içinde çalıştırmanızı gerektirmediğini fark etmelisiniz. DB'ye girmesi gerekmeyen kodu taşıyarak , onu DB'nin geri kalanının fiziksel ortamında çalışacak şekilde kısıtlıyorsunuz - DB'nizin gerçek veri yönetimi bölümü ile aynı donanım kaynakları için rekabet ediyor. Kodu diğer DB sunucularına ölçeklemek için (gerçek verileri değil) - elbette, bu mümkün olabilir , ancak çoğu durumda ek lisanslama maliyetleri dışında tam olarak ne kazanıyorsunuz? DB üzerinde olması gerekmeyen şeyleri DB'den uzak tutun.
- Re: SQL / C # performans - bu bir ilgi konusu gibi göründüğü için, tartışmaya biraz ekleyelim. Kesinlikle yerel / Java / C # kodunu DB'ler içinde çalıştırabilirsiniz, ancak bildiğim kadarıyla burada tartışılan şey bu değildir - tipik uygulama kodunu C # gibi bir şeye kıyasla T-SQL gibi bir uygulamada karşılaştırıyoruz. Geçmişte ilişkisel kodla çözülmesi zor olan bir takım sorunlar var - örneğin, bir oturum açma veya oturum kapatmayı ve zamanı gösteren kayıtlara sahip olduğunuz "maksimum eşzamanlı oturum açma" sorununu düşünün ve herhangi bir zamanda giriş yapan maksimum kullanıcı sayısı. Mümkün olan en basit çözüm, kayıtlar arasında yineleme yapmak ve giriş / çıkışlarla karşılaştıkça bir sayacı arttırmak / azaltmak ve bu değerin maksimumunu takip etmektir.Mayıs, Bilmiyorum), yapabileceğiniz en iyi şey bir CURSOR (tamamen ilişkisel çözümlerin hepsi farklı karmaşıklık düzenleri üzerindedir ve bir while döngüsü kullanarak çözmeye çalışmak daha kötü performansla sonuçlanır). Bu durumda, evet, C # çözümü aslında T-SQL'de elde edebileceğinizden daha hızlıdır. Bu çok zor gibi görünebilir, ancak göreceli değişiklikleri temsil eden satırlarla çalışıyorsanız ve bunlar üzerindeki pencereli toplamaları hesaplamanız gerekiyorsa, bu sorun finansal sistemlerde kolayca kendini gösterebilir. Depolanan proc çağrıları da daha pahalı olma eğilimindedir - önemsiz bir SP'yi milyon kez çağırır ve bunun bir C # işlevini çağırmakla nasıl karşılaştırıldığını görün. Yukarıdaki birkaç diğer örnek ima - henüz C # yapmak oldukça kolay iken, kimsenin T-SQL (aslında bazı faydalar verir) uygun bir karma tablo uygulamak karşılaşmadım. Yine, DB'lerin harika olduğu şeyler ve çok da harika olmadıkları şeyler var. Tıpkı C # 'da JOIN, SUM ve GROUP BYs yapmak istemeyeceğim gibi, T-SQL'de özellikle CPU yoğun bir şey yazmak istemiyorum.