SQL Server verileri 8Kb'lık yapılar halinde tutmaktadır. Bu yapılara
"page" adı verilir. İşlem görmek için talep edilen veriler öncelikle memory'e yüklenir. Mamory'deki pagelere
"buffer", tüm veritabanlarındaki veri ve index pagelerinin toplandığı ortak havuza ise
"buffer cache" veya
"buffer pool" adı verilir.
Buffer Pool'un varlık amaçlarından birisi, I/O yükünü azaltıp veri üzerindeki işlem taleplerinin mümkün olduğunca hızlı gerçekleştirilebilmesini sağlamaktır.
Bir değişiklik talebi oluştuğunda önce veri diskten okunup Buffer Pool'a alınır ve değişiklikler uygulanır. Tam bu noktada veri diskte farklı, Buffer Pool'da farklı olabilmektedir. Buffer Pool'daki farklı verinin tutulduğu pagelere
"dirty page" adı verilir. Bu dirty pageler bir takım şartların sağlanmasıyla
Checkpoint adı verilen işlem sayesinde diske yazılarak kalıcı hale gelmiş olur. Aksi halde bir felaket durumunda Buffer Pooldaki pageler diske yazılmadığı için kaybedilirdi.
Verilerin Buffer Pool'da olması hızlı erişim için büyük avantaj sağlamakta.
Daha büyük memory, daha geniş bir Buffer Pool ve bu da daha çok veri ile daha az gecikmeli çalışma anlamına gelir.
SQL Server'ın performansını arttırmak için donanımsal çözümlere sarılmak en son yapılacak işlerdendir. Ancak bazen konu memory artırımına kadar gelmiş olabilir. Eğer imkan varsa memory arttırımı gerçekleştirilir.
Peki ya daha geniş bir Buffer Pool ihtiyacı doğmasına rağmen, memory arttırımı yapılamıyorsa veya yapılması istenmiyorsa?
Bu konudaki talepleri değerlendiren Microsoft,
SQL Server 2014 ile birlikte
Buffer Pool'u diske genişletebilme özelliğini duyurmuştur.
Buffer Pool'u genişletmeniz gerekmesine rağmen, anakart gibi donanımsal limitlere, çeşitli kurallara, yüksek fiyatlara takılarak memory arttırımını gerçekleştiremiyorsanız
"Buffer Pool Extension (BPE)" özelliğine bir göz atmak isteyebilirsiniz. Belki de sadece kısa bir dönem için daha geniş bir Buffer Pool'a ihtiyacınız vardır. Bu durumda donanım değişikliğine gitmenize gerek kalmayacaktır.
SQL Server 2014 ile birlikte gelen
"Buffer Pool Extension (BPE)" özelliği kolayca konfigure edilebilir. Bu sebeple
esnek depolama alanı imkanı sunar.
Disk ile memory fiyat bakımından karşılaştırıldığında da ceplerin daha sıcak kalacağı malumdur.
Memoryi diske genişletme fikri yüksek performans kazanılacağı konusunda pek ikna edici olmayabilir. Ancak bardağın dolu tarafından bakarsak eğer;
çok daha büyük bir veri kümesini toplamda, memorye nazaran daha yavaş, diske nazaran daha hızlı şekilde kullanabiliriz. Buradan anlaşılıyor ki, BPE özelliğinin getirisini arttırmak için disk seçimi de bir hayli önem arz etmektedir. Klasik HDD yerine yaklaşık
100 kat daha hızlı SSD diskler tercih edilmelidir.
BPE, özellikle
okuma ağırlıklı OLTP iş yükleri için performans kazancı sağlamaktadır. Diskte ayırdığımız BPE alnında
clean pageler yani commit edilmiş veriler saklandığı için herhangi bir
anomali beklenmez. Özetle veri kaybı
riski memoryde olduğundan fazla değildir. Eğer diskin başına bir şey gelirse
BPE otomatik olarak
disable olur. Dolayısıyla serverın çalışmasını engelleyecek bir durum beklenmez. Manual olarak yönetilebildiği gibi, instance başlatıldığında da yeniden aktif olacaktır(belirtilen yol varsa). Bu özelliğin güzel taraflarından birisi de herhangi bir
uygulama taraflı değişiklik yapmaya gerek kalmadan ihtiyaç duyulduğunda aktif edilebilmesi ve kaldırılabilmesidir.
Nasıl yapıyoruz?
Oldukça basit şu script yardımıyla diskte
"EkHavuz.BPE" isminde
10 GB boyutunda bir alan rezerve edebiliriz. BPE'yi
hatasız aktif edebilmek için
SIZE parametresi her defasında mevcut
Buffer Pool'dan büyük olarak belirtilmelidir.
ALTER SERVER
CONFIGURATION
SET BUFFER POOL EXTENSION ON
(
FILENAME = 'D:\EkHavuz.BPE',
SIZE
= 10 GB
)
Böylece EkHavuz.BPE alanını memory Buffer Pool'umuza extend etmiş olduk. Şu DMV yardımıyla BPE konfigurasyonu hakkında bilgi alabilirsiniz:
SELECT
path,
file_id,
state,
state_description,
current_size_in_kb
FROM sys.dm_os_buffer_pool_extension_configuration;
EkHavuz.BPE'nin hangi veritabanından kaç tane page barındırdığını görmek isterseniz aşağıda gibi DMV'den faydalanabilirsiniz:
SELECT
COUNT(*)AS cached_pages_count
,CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(database_id)
END AS database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) ,database_id
ORDER BY
cached_pages_count DESC;
BPE özelliğini pasif hale getirmek isterseniz şu scripti çalıştırmanız yeterli:
ALTER SERVER
CONFIGURATION
SET BUFFER POOL EXTENSION OFF
SQL Server 2014 ile gelen
"Buffer Pool Extension" özelliği memory arttırımına gerek kalmadan diski kullanarak Buffer Pool'u genişletmemizi sağladı. İşe yarar bir özellik.
Bu faydalı ve esnek depolama hizmeti
Enterprise,
Standart ve
Business Intellingence sürümlerinde kullanılabilmektedir.
Bir gün sizin de işinize yarayabilir.