20 Temmuz 2007 Cuma

PGA ve UGA

PGA tipik olarak C’nin çalışma zamanı çağrısı (run-time call) malloc() ile oluşturulur ve çalışma zamanında küçülüp büyüyebilir. PGA her zaman SGA’in içindedir. UGA ise oturuma aittir ve yeri Oracle’ın konfigüre edilme şekline göre değişir.

PGA ve UGA’in büyüklüğünü etkileyen en önemli etkenlerden biri init.ora ‘daki oturum seviyesi parametreleri olan SORT_AREA_SIZE ve SORT_AREA_RETAINED_SIZE ’dır. Bunlar Oracle’ın diske yazmadan önce verilerin sort işlemi için ne kadar alan ayıracağını ve işlemden sonra bu alanın ne kadarını tutacağını belirler. SORT_AREA_SIZE genelde PGA ‘in dışında yer alır, SORT_AREA_RETAINED_SIZE ise UGA ‘in içinde olur.

SGA

Her bir Oracle instance’ının (örnek) büyük, paylaşımlı bir bellek yapısı vardır, buna topluca SGA (System Global Area) (Sistem Küresel Alanı) denir. Oracle işleçleri (process) bu alana erişirler. SGA’i görüntülemek için V$SGASTAT adlı sihirli (magic) V$ tablosu kullanılabilir.
SGA çeşitli havuzlara (pool) ayrılmıştır, bunlar:

Java pool (Java Havuzu) :Veritabanında çalışan JVM için ayrılmıştır, sabit büyüklüktüktedir.

Large pool (Büyük Havuz): MTS tarafından oturum belleği (session memory) için, Paralel İşlem (Parallel Execution) tarafından mesaj tamponları (message buffers) için ve RMAN (Recovery Manager) Backup (Kurtarma Yöneticisi Yedekleyicisi) tarafından disk I/O tamponları (buffers) için kullanılır.

Shared pool (Paylaşımlı Havuz) : Paylaşımlı kürsörleri, kayıtlı yordamları (stored procedures), durum nesnelerini (state objects), dizin önbelleklerini (directory caches) ve diğer pek çok veriyi tutar.

The ‘Null’ pool : Bu bölümün aslında bir adı yoktur. Üç bellek türünü içerir: Blok tamponları (block buffers) (cached database blocks), redo kütük tamponu (redo log buffer) ve sabit (fixed) SGA.

Sabit SGA (Fixed SGA)

Genellikle çok küçüktür. Büyüklüğü platformdan platforma ve sürümden sürüme değişir. Kurulum sırasında Oracle binary’ye derlenir, bu yüzden sabittir. SGA, bu bölümü SGA’in diğer bölümlerine ve parçalarına erişmek için kullanır. Çeşitli parametre değerlerini tutan ve SGA’in diğer bileşenlerine işaret eden değişkenleri tutar.

Redo Tamponu (Redo Buffer)

Online redo kütüklerine (log) yazılacak veriler diske yazılamadan önce geçici olarak burada tutulur. Redo kütük tamponlarının (redo log buffer) kullanımı veritabanının işleyişini hızlandırabilir. Bu bölümün içeriği şu durumlarda boşaltılır:

3 saniyede bir veya birisi commit (işlemek, teslim etmek) ettiğinde veya üçte biri dolduğunda veya verilerin toplamı 1 MB’a ulaştığında. Bir veritabanı sisteminin bir iki MB’tan daha büyük bir redo tamponuna ihtiyaç duyması çok ender görülen bir durumdur.

Redo tamponunun ayarlanmamış (default) büyüklüğü 512 KB ile (128*CPU sayısı)’dan büyük olanın değerine eşittir, bu init.ora dosyasındaki LOG_BUFFER parametresi ile kontrol edilir. Redo tamponunun en küçük büyüklüğü ise en büyük veri bloğunun dört katıdır.

Blok Tampon Önbelleği (Block Buffer Cache)

Oracle, veritabanı bloklarını diske yazmadan önce ve diskten okuduktan sonra burada depolar. Bu bölüm küçük olursa sorgular çok uzun sürer, büyük olursa diğer işleçler (process) görev yapamaz hale gelir.

Üzerine veri yazılmış bloğa ‘kirli’ blok, henüz üzerine veri yazılmamış yani boş olan bloğa da ‘temiz’ blok denir. Kirli bloklar ayrı bir listede, temiz bloklar ayrı bir listede tutulur. Kirli bloklar Veritabanı Blok Yazıcısı (Database Block Writer, DBWn) tarafından yazılır.

Oracle, her bir blok için ‘dokunma sayısı’ (touch count) şeması tutar. Önbellekteki blok hit aldıkça sayacı bir artırılır. X$BH tablosu, Blok Tampon Önbelleğindeki (BTÖ) bloklar hakkında bilgi verir.

Oracle 8.0’dan itibaren BTÖ’ye çoklu tampon havuzları özelliği eklenmiştir. Bu özellik sayesinde BTÖ’de belirli miktarda bir alan özel segmentler için ayrılabilir (örneğin lookup tabloları için). Bu ayırdığımız alandaki blokların ilgisiz bloklar tarafından yaşlandırılmasını (age out) engeller. Yaşlanmaya dayalı saklamaya, saklama havuzu (KEEP pool) denir.

Geri dönüşüm havuzlarında (RECYCLE pool) ise blok, ihtiyaç duyulmaz hale gelir gelmez yaşlandırılır.

Paylaşımlı Havuz (Shared Pool)

Başarım (performance) ve ölçeklenirlik (scalability) açısından önemlidir. Küçük olursa başarımı durma noktasına kadar düşürebilir, çok büyük olursa da gene aynı etkiyi yapacaktır, yanlış kullanıldığı takdirde de sonuç felaket olacaktır.

Oracle pek çok program veri parçasını burada önbellekler, örneğin bir sorgunun (query) ayrıştırma (parse) sonuçları gibi. Bir sorgu ayrıştırılacağı zaman Oracle öncelikle buraya bakar, daha önce yapılmış mı diye.

PL/SQL kodu burada önbelleklenir, böylece bir dahaki sefere diskten okunması gerekmez ve paylaşılır da, örneğin aynı anda işleyen 1000 tane oturum varsa kodun tek bir kopyası bunlar arasında paylaşılır.
Sistem parametreleri, veri dizin önbelleği (data dictionary cache) ve nesneler hakkındaki önbelleklenmiş bilgi burada tutulur. Paylaşımlı havuz yaklaşık 4 KB büyüklüğündeki bellek parçalarından oluşur ve bellek LRU (Leasy Recently Used) (En Seyrek Kullanılan) ile yönetilir. Paylaşımlı havuz, sorgu planlarının tekrar tekrar kullanılması için tasarlanmıştır.

Büyük Havuz (Large Pool)

Büyük bellek parçalarını tutmak için kullanılır, paylaşımlı havuzun tutmakta zorlanacaklarını. Büyük havuz, geri dönüşüm havuzuna (recycle pool) benzer (yaşlandırma kullnılmaz, veriye ihtiyaç ortadan kalkar kalkmaz silinir). Paylaşımlı havuz ise saklama havuzuna (keep pool) benzer.

Büyük havuzdaki bir bellek parçası serbest bırakıldığı anda bir başka işleç (process) tarafından kullanılabilir. Büyük havuz özellikle
1) MTS tarafından UGA için,
2) İfadelerin paralel yürütülmesi (parallel execution of statements) için,
3) Yedekleme (Backup) için (RMAN disk I/O tamponları için) kullanılır.

MTS kullanırken büyük havuz kullanılması zorunlu değildir ancak kullanılaması tavsiye edilir ayrıca büyük havuz büyüklüğünün elle ayarlanması tavsiye edilir. Ayarlanmamış değer durumunuz için uygun olmayacaktır.