Özet: DBA’lere, veritabanlarında en çok “Buffer_Gets” yapan sorguların tespiti, bu beklemelerin nedenleri ve alınabilecek önlemler hakkında bilgi vermek.
“Buffer Gets” Nedir?
“Buffer Gets”, adından da anlaşılacağı gibi, Oracle’un “buffer’dan veri alması” için kullanılan bir terimdir.
Özete; Oracle, sorguları çalıştırırken, verilerin bulunduğu “data block“‘ları için, önce “database buffer cache“‘de bu blocklar var mı diye kontrol eder. Eğer memory’de(buffer cache) bu block’ları bulursa, oradan okur(read). Bu hareketine “buffer_gets” diyoruz.
Eğer bu “data blockları“nı “buffer cache“‘de bulamazsa, disk’e gidip bu verileri alıp “buffer cache”‘e koyar. Bu işlem, sorgunun çok daha maliyetli çalışmasına neden olur.!
“Buffer Gets” istenen bir durum mudur?
Oracle’un çok fazla “Buffer Gets” yapması her zaman iyi bir şeydir anlamına gelmiyor tabi.! Yapacaksak belki sadece kıyaslama yapabiliriz: “Buffer Gets”‘i “Disk read”‘inden fazla ise daha iyidir diyebiliriz.
Oracle, I/O’ları Logical I/O(Buffer gets) ve Physical I/O(Disk read) diye ikiye ayırıyor. Physical I/O’lar, disk darboğazından dolayı veritabanı için çok daha maliyetlidir.
Eğer sorgularınız çok “Buffer_Gets” yapıyorsa, bir süre sonra aradığı data blockları buffer cache’de bulamayacağı ve dolayısı ile disk’e gitmek(Physical I/O) zorunda kalabileceği anlamına geliyor. Diğer taraftan çok fazla I/O yapması, CPU’yu da çok fazla kullanmasına neden olacatır.
“Buffer Gets” çok ise ne yapmalı?
Çok “Buffer gets” yapan sorgularınıza çözüm olarak:
- Öncelikle sorguların daha az I/O yapacak şekilde iyileştirimesi(tune edilmesi) gerekiyor. Burada hem DBA’ler hem de yazılımcılar giriyor devreye.
- DBA’ler sorgunun çalışma planlarını(execution plan) kontrol edip, çok I/O’ya neden olan “full table scan” gibi olayları varsa, “index” ya da “partition” çözümleriyle doğru planı bulmalıdır. Objelerin istatistiklerinin güncelliği de kontrol edilmelidir. Objelerde fragmantasyon var mı bunun kontrolü ve düzeltilmesi gerekmektedir. Gerekiyorsa uygun hintler önerilmeli.
- Diğer taraftan yazılımcılara durum iletilmeli. Sorgunun gereksiz büyük tablolarda dolaşmadan, gereksiz joinler yapmadan, yapısı değiştirilerek daha az I/O yapar hale getirilmesi talep edilmelidir.
- Veritabanına verilen memory değerleri ve parametreleri incelenmeli. Eğer “buffer cache” değerleri yetersizse, kaynak iyileştirmesi için çalışmalara başlaması gerekir.
“Buffer Gets” çok yapan sorgular nasıl bulunur?
En çok “Buffer Gets” sorgularını geçmişe yönelik alttaki AWR bölümlerinde (SQL ordered by Gets) bulabileceğiniz gibi, mevcut durumda v$sql ya da v$sqlarea view’lerinden aşağıdaki sorgularla da görebilirsiniz.
Select * from ( select parsing_schema_name "user ", sql_id,hash_value,buffer_gets, executions, buffer_gets/(case when executions=0 then 1 else executions end) "buffer_gets/execution", a.sql_fulltext from v$sqlarea a where buffer_gets > 100000 and parsıng_schema_name not in ('sys','dbsnmp','sysman') and parsıng_schema_name not like 'xx%' Order by buffer_gets desc ) Where rownum <= 30;
Görüşmek üzere…