Bu BÜYÜK bir soru ve cevapları büyüleyici buluyorum. Bunu bir Oracle DBA olarak yorumlayacağım ve cevaplarım Oracle veritabanına ÖZELDİR. Bu, Oracle ile çalışırken birçok insanın yaptığı büyük bir hatadır. Bunun diğer uygulamalar için de geçerli olup olmadığından emin değilim. Bu konu dışı olmak değil, özel bir cevap olarak ifade edilir.
Oracle ile performansı ayarladığınızda, gerçekten tıkanıklıkları gidermeyi düşünüyorsunuz. Birçoğumuz söylemese de, Kısıtlamalar Teorisi'ne dayanmaktadır: https://en.wikipedia.org/wiki/Theory_of_constraints
Bellek, tıkanıklığınız olmayabilir. Oracle, belleği yönetmek için karmaşık mekanizmalara sahiptir ve sadece belleği artırmak, eğer diğer bölgelerdeki darboğazın olduğu yerlerde işleri yavaşlatabilir. Size çok yaygın olan bir örnek vereyim.
Sorgular yavaş görünüyor. Anlaşmaya varmak, RAM'i arttırırsak, hafızaların diskten daha hızlı olması nedeniyle sorguların yanıt süresini arttırmalıyız. Eh ... Oracle, veri için bellek yönetimini bu şekilde ele alıyor. Oracle, belirli görevlere tahsis edilmiş çeşitli bellek konumlarına sahiptir. Böylece bu hatıraları artırabilirsin. Veriler için kullanılan alana 'tampon önbellek' adı verilir. Bu, bir dizi bağlantılı listedir (bunların sayısı her sürümde artma eğilimindedir). Bir sorgu sırasında diskte bir blok bulunduğunda, hangi listeye ekleneceğini belirlemek için üzerinde bir karma algoritması çalıştırılır. Listeye nereye yerleştirileceği bir dokunma sayımı algoritmasına dayanır (Oracle destek sitesinde açıklanmıştır, bu yüzden almak için para ödemeniz gerekiyor ... bu gerçekten önemli değil).
Ancak, bir sorgu çalıştırdığınızda Oracle, o zaman aradığınız arabellek zincirinde bir mandal alır. Bu LATCH (not: bu bir kilit değildir. Farkı bilmiyorsanız Google "mandal") bu zincirdeki diğer tüm işlemleri okuduğunuz süre boyunca engeller. Bu yüzden okurları engeller VE yazar (bu tamamen Oracle'ın kilitleri okurları engellemediğini iddia etmekten tamamen farklıdır).
Bu gereklidir, çünkü zincirdeki bloğu okuduğunuzda Oracle, ne kadar sıklıkla 'talep edildiğine' bağlı olarak hareket eder. Daha sık talep edilen bloklar en üste taşınır ve daha az sıklıkta talep edilen bloklar en altta bırakılır ve yaşlandırılır. Bağlantılı bir listeyi okuyan ve dolaşan blokları hareket ettiren 2 seansa sahip olamazsınız veya var olmayan konumlara işaret eden işaretçilere çarpacaksınız.
Hafıza boyutunu artırdığınızda, bağlantılı her listenin boyutunu artırırsınız. Bu, listenin okunması için geçen süreyi artırır. Tek bir zayıf sorgu veya karmaşık sorgu, bağlantılı listelerde on binlerce, hatta milyonlarca okuma yapabilir. Her okuma hızlıdır, ancak bunların sayısı alınan mandallara yol açar ve bunlar diğer oturumları engeller. Oracle buna 'mantıksal bir IO' (ya da arabellek ya da başka şeyler gibi) diyor.
Bu nedenle, eğer liste daha uzunsa ve gerçekten kötü SQL kullanıyorsanız, SQL ifadeleri mandallarını daha uzun tutacaktır. Belleğin arttırılması, zaman zaman performansı AZALTABİLİR. Çoğu zaman, bu olmayacak. İnsanlar çok para harcayacak ve fayda görmeyecekler. Bununla birlikte, arabellek önbelleğinde daha fazla belleğe ihtiyaç duyduğunuz, ancak bunun uygun olup olmadığını bilmek için darboğazı doğru bir şekilde tanımlamanız gereken zamanlar vardır. Bu yazıda bunun nasıl analiz edileceğini tartışamam. DBA forumlarına bakın. Bazı insanlar orada tartışıyor. Oldukça karmaşık.
Bunun olabileceği başka yazılım parçaları ile ilgili özel örnekleri olan var mı? Bir fabrikada kısıtlamaları hafifletmeyi tartışan 'Hedef' adlı müthiş bir iş kitabı var. Bu süreç, performans sorunlarını değerlendirirken Oracle DBA'ların yaptıklarına çok benzer. MBA programlarında genellikle standart bir okumadır. BT meslekleri için okumak çok değerli.
https://en.wikipedia.org/wiki/Eliyahu_M._Goldratt