Özet: DBA’lere, veritabanlarında en çok “Disk Reads” yapan sorguların tespiti, bu beklemelerin nedenleri ve alınabilecek önlemler hakkında bilgi vermek.

 

“Disk Reads” Nedir?

“Disk Reads”, adından da anlaşılacağı gibi, Oracle’un “disk’den veri okuması” için kullanılan bir terimdir.

Oracle, I/O’ları Logical I/O(Buffer gets from memory) ve Physical I/O(Disk read) diye ikiye ayırıyor.

Özetle; Oracle, ihtiyacı olan veri block’larını memory’de bulamazsa, o verileri disk’ten okuyup memory’e koyuyor. Bu işlem “Disk Reads” olarak geçiyor.

 

“Disk Reads” istenen bir durum mudur?

“Disk Reads” veritabanı için genellikle maliyetli bir aşamadır. Burada disk I/O sınırlarına takılacağı için, sorgunun performansını düşürecektir. Ayrıca CPU kullanımını arttıracaktır. Bu nedenle Physical read’in(Disk Reads) en aza indirilmesi gerekiyor.

Sorguları çalıştırırken, “memory(buffer cache)” gibi hızlı bir konumdan data blocklarını okumak varken, Oracle onları memory’de bulamazsa, öncelikle disk’e gidip disk’ten veri blocklarını alıp memory’e koyması gerekiyor(Disk Reads).  Bu süreç ms’ler sürecek bir sorgunun, dk’lar sürmesine neden olabilir.

 

“Disk Reads” çok ise ne yapmalı?

Eğer sorgularınız çok fazla “Disk Reads” yapıyorsa olası çözümler için adım atabilirsiniz.

  • Sorgu uzun zamandan sonra ilk defa mı çalışıyor, o yüzden mi “Disk Reads” yapıyor? Eğer öyleyse, ilk çalışmasında ilgili data block’larını disk’ten memory’e alması gerekecek ve bu “Disk Reads“i yapacaktır.
  • Sorgu eğer yüksek “Buffer Gets” yapıyorsa, ve bu kadar çok data block’unu memory’de bulamayıp, bu nedenden disk’e gidip alması gerekebilir?  Eğer bundan dolayı diske gitmesi gerekiyorsa, burada “Buffer Gets’i” azaltmak için aldığınız önlemleri ele almalısınız.(eksik index kontrolü, partition gerekliliği, istatistiklerin güncelliği, fragmantasyon kontrolü, sorguların gereksiz I/O yapmasını önlemek için tekrardan yazılması gibi..)
  • Çok sık full scan yapması gereken küçük tablolar için “KEEP Buffer Pool”‘a koyma testleri yapabilirsiniz.
    • ALTER TABLE <table> STORAGE (BUFFER POOL KEEP);
    • ALTER INDEX <index> STORAGE (BUFFER_POOL KEEP);
  • Bunlar sorunu büyük ölçüde çözecektir. Çözmüyorsa disk seviyesinde kontroller ve iyileştirmeler için adımlar atmak gerekiyor. Ayrıca DB parametrelerini incelemeye almak gerekir.

 

“Disk Reads” çok yapan sorgular nasıl bulunur?

En çok “Disk Reads” sorgularını geçmişe yönelik alttaki AWR bölümlerinde (SQL ordered by Reads) bulabileceğiniz gibi, mevcut durumda v$sql ya da v$sqlarea view’lerinden aşağıdaki sorgularla da görebilirsiniz.

Disk_read_1

Select * from
 (select parsıng_schema_name "User ",
 sql_id,hash_value
 disk_reads, executions, disk_reads/(case when executions=0 then 1 else executions end) "Disk Reads/Executions",
 sql_fulltext
 from v$sqlarea x
 where disk_reads > 100000 and parsıng_schema_name not in ('sys','dbsnmp','sysman') and parsıng_schema_name not like 'xx%'
 order by disk_reads desc)
 where rownum <= 30;

Disk_read_1_out

Görüşmek üzere…