Sayfalar gerektiği şekilde belleğe okunur, kullanılabilir boş bellek yoksa, değiştirilmemiş en eski sayfa gelen sayfa ile değiştirilir.
Bu, belleğe sığabileceğinden daha fazla veri gerektiren bir sorgu yürütürseniz, birçok sayfa bellekte çok kısa bir ömür yaşayacaktır ve bu da çok fazla G / Ç ile sonuçlanacaktır.
Bu etkiyi, Windows Performans İzleyicisi'ndeki "Sayfa Yaşam Beklentisi" sayacına bakarak görebilirsiniz. Bu sayaç hakkında harika ayrıntılar için https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy adresine bakın .
Yorumlarda, özellikle sorgunun sonuçları kullanılabilir arabellek alanından daha büyük olduğunda ne olacağını sordunuz . En basit örneği ele alalım, select * from some_very_big_table;
- tablonun 32GB max server memory (MB)
olduğunu ve 24GB olarak yapılandırıldığını varsayın . Tüm 32 GB tablo verileri, sayfa arabelleğindeki sayfalara teker teker okunacak, kilitlenecektir, ağ paketlerine biçimlendirilmiş ve kablo üzerinden gönderilmiştir. Bu sayfa sayfa gerçekleşir; aynı anda çalışan 300 sorguya sahip olabilirsiniz ve engelleme olmadıklarını varsayarsak, her sorguya ait veriler sayfa tampon alanına, her seferinde bir sayfaya okunacak ve müşteriye olabildiğince hızlı bir şekilde telin üzerine konulacaktır. veri isteyin ve tüketin. Her sayfadaki tüm veriler kabloya gönderildikten sonra, sayfa kilitlenmez ve çok hızlı bir şekilde diskteki başka bir sayfa ile değiştirilir.
Daha karmaşık bir sorgu durumunda, örneğin birkaç tablodan sonuçların toplanması durumunda, sayfalar sorgu işlemcisinin gerektirdiği gibi belleğe alınacaktır. Sorgu işlemcisi sonuçları hesaplamak için geçici bir çalışma alanına ihtiyaç duyarsa, sorgu için bir plan derlediğinde bunu önceden bilecek ve SQLOS'tan çalışma alanı (bellek) isteyecektir . SQLOS bir noktada ( zaman aşımına uğramadığı varsayılarak ) bu belleği sorgu işlemcisine verir ve bu noktada sorgu işlemeye devam edilir. Sorgu işlemcisi, SQLOS'tan ne kadar bellek isteneceğini tahmin ederken bir hata yaparsa, bir "diske dökülme" gerçekleştirmesi gerekebilirverinin geçici olarak geçici bir şekilde bir ara formda yazıldığı işlem. Tempdb'ye yazılan sayfalar, diğer sayfaların belleğe okunması için yer açmak üzere tempdb'ye yazıldıktan sonra açılır. Sonunda sorgulama işlemi, mandallama kullanılarak tamponda boş olarak işaretlenmiş sayfalara çağrılarak tempdb'de saklanan verilere dönecektir.
Şüphesiz yukarıdaki özette çok teknik detaylar bir yük eksik, ama SQL Server belleğe sığabilecek daha fazla veri nasıl işleyebilir özünü yakalar düşünüyorum.