Bellek Yönetimiyle İlgili Notlar ORACLE BELLEK YÖNETĐMĐYLE ĐLGĐLĐ NOTLAR

Benzer belgeler
DĐNAMĐK ve STATĐK SQL KULLANMANIN PERFORMANSA ETKĐSĐ

PCTFREE - PCTUSED ORACLE DEĞERLERĐ

ORACLE DATAFILE RECOVER (KURTARMA) TESTLERĐ

ORACLE VERĐTABANINDA TABLO ve INDEX SIKIŞTIRMA

SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır.

Advanced Oracle SQL Tuning

ORACLE INDEX SIKIŞTIRMA TEKNĐKLERĐ

Veritabanı Tasarımı. Sütun Değerlerini Güncelleme ve Satırları Silme

PostgreSQL Veritabanı Sunucusu. HOT, VACUUM ve BGWRITER

Veritabanı Tasarımı. Veritabanı Hareketleri

1 ORACLE 11G DATABASE SERVER LE

İleri Seviyede PostgreSQL Yönetimi Devrim GÜNDÜZ. PostgreSQL Geliştiricisi PostgreSQL Markafoni

Exadata Üzerinde Veri Sıkıştırma Yöntemleri

VERİ TABANI YÖNETİM SİSTEMLERİ I

BÖLÜM -6: VERİLERİ DEĞİŞTİRMEK

BÖLÜM- 8: DİĞER ŞEMA NESNELERİNİ OLUŞTURMA

VERĐTABANI YÖNETĐM SĐSTEMLERĐ

SQL Komutları (2) Uzm. Murat YAZICI

MOBİL UYGULAMA GELİŞTİRME

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler

TRIGGER. Trigger lar, tablo üzerinde tanımlanabilen ve bu tablo üzerinde bir işlem gerçekleştiğinde tetiklenen programlama ögeleridir.

Oracle da kullanılan veri tipleri:

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

Data Programming SQL Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

PostgreSQL ve PL/pgSQL

HP Yazılım Zirvesi - İstanbul 20 May Wyndham Grand Levent Erdem Alaşehir / Finansbank Güvenlik Olay Korelasyonunda Büyük Veri Kullanımı

Veritabanı Tasarımı. Seriler ile Çalışma

PostgreSQL'de Uygulamalı. (Streaming Replication. Standby)

Veritabanı Tasarımı. Kullanıcı Erişimini Kontrol Etme

Yukarıdakilerden hangileri DML (Data Manipulation Language) ile gerçekleştirilir?

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır.

PostgreSQL ve PL/pgSQL

SQL TRIGGERS (Tetikleyiciler)

VERİTABANI ve YÖNETİMİ

Startup ve Shutdown Yöntemleri. ORACLE STARTUP ve SHUTDOWN YÖNTEMLERİ

VERİ TABANI YÖNETİM SİSTEMLERİ I

STORED PROCEDURE LER (Saklı Yordamlar)

VERİ TABANI YÖNETİM SİSTEMLERİ

Oracle 11gR2 Üzerine Dataguard Kurulumu Türkçe

Table of Contents

VERİ TABANI ve YÖNETİMİ

EXISTS VE NOT EXISTS fonksiyonları

ORACLE ONLINE REDO LOG DOSYALARI

PostgreSQL Veritabanı Sunucusu. Başarım Arttırma Yöntemleri

SQL'e Giriş. SELECT Deyimi. SQL Komutları. Yardımcı Deyimler

ORACLE PARAMETRE DOSYALARI ( PFILE & SPFILE )

Çok tablolu sorgulamalar

PostgreSQL Veritabanı Sunucusu. 8.2 neler getiriyor?

Veritabanı Tasarımı. DML İşlemleri ve Görünümler

VT Sistem Gerçeklemesi. Ders Notları- #8

UTL_FILE PERFORMANSI

Veritabanı Tasarımı. Tablo Oluşturma

-- işareti tek satırlık açıklamalarda kullanılır. Açıklama olarak yazılan satırın önüne konulması yeterlidir.

20461C Querying Microsoft SQL Server Modül Seviye Belirleme Testi

SQL'e Giriş. SELECT Deyimi. SQL Komutları. 1. DDL (Data Definition Language - Veri Tanımlama Dili)

VERİ TABANI YÖNETİM SİSTEMLERİ I

Basit SQL Sorguları Veritabanından verilerin SELECT cümleleri ile alınması işlemine sorgulama denir.

Veritabanı Tasarımı. Tablo Değiştirme

Bir çeşit prosedür. Ancak bu prosedür kendiliğinden çalışır. Çalışması için tabloya veri eklemek, veri silmek, veri değiştirmek yeterlidir.

VERİTABANI Veritabanı Yönetimi

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir, aksi durumda hata olur.

YAPISAL SORGULAMA DİLİ (SQL)

Fiziksel Veritabanı Modelleme

VIEW LERDE SQL HINT KULLANIMI

Veritabanı Yönetim Sistemleri I HAFTA 1

Unutulmuş Özellikler: Oracle Veritabanına Yaptığınız Yatırımı Sonuna Kadar Kullanın

SQL PROGRAMLAMA. Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir.

VERİ TABANI YÖNETİM SİSTEMLERİ II. 5. SQL PROGRAMLAMADA CURSOR (İMLEÇ) ve TRIGGERS (TETİKLEMELER)

8 Oracle da tablo yapısı içinde otomatik artan kolon yoktur. (identity kolon

Elbistan Meslek Yüksek Okulu GÜZ Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

Veritabanı Yönetim Sistemleri (Başarım Eniyileme Performance Tuning)

Veri Tabanı Programlamaya Giriş

VERİTABANI Veritabanı Sorgulama

Emrah UYSAL 1 TABLESPACE ENCRYPTION ORACLE 11G

Veritabanına Giriş. Oğuzhan Ceylan. 19 Eylül 2011

KULLANICI TANIMLI FONKSİYONLAR

İNTERNET PROGRAMCILIĞI DERSİ

SQL Deyimleri. Öğr.Gör.Volkan ALTINTAŞ Volkanaltintas.com

Üst Düzey Programlama

Veritabanı Tasarımı. İndeksler ve Eşanlamlar

5 SQL- Yapısal Sorgulama Dili. Veritabanı 1

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

ÜNİTE NESNE TABANLI PROGRAMLAMA I. Uzm. Orhan ÇELİKER VERİTABANI SORGULARI İÇİNDEKİLER HEDEFLER

Öğr.Gör.Murat KEÇECĠOĞLU. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

Veritabanı Tasarımı. Kartezyen Çarpım ve Join İşlemleri

Kullanıcı tanımlı fonksiyonlar SQL2000 ile gelen özelliklerden biridir. Fonksiyonlar tek bir değer veya tablo döndürmek için kullanılır.

Veritabanına Uygulanması

ASM (Automatic Storage Manager) 11 Mayıs 2009

Aşağıdaki tabloyu inceleyin. Sorgulama işlemlerini bu tabloya göre yapacağız.

ALGORİTMA VE PROGRAMLAMA II

Bilgisayar Teknolojileri Bölümü Bilgisayar Programcılığı Programı. Öğr. Gör. Cansu AYVAZ GÜVEN

Veri Tabanı-I 5.Hafta

ÜNİTE NESNE TABANLI PROGRAMLAMA I. Uzm. Orhan ÇELİKER VERİTABANI SORGULARI İÇİNDEKİLER HEDEFLER

SUNGURLU MESLEK YÜKSEKOKULU 5. T-SQL

ORACLE FLASHBACK DATABASE TEKNOLOJĐSĐ

«BM364» Veritabanı Uygulamaları

DML işlemleri. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı May Öğr. Gör. Murat KEÇECĠOĞLU

Tablolar Arası İlşikiler ve Alan Özellikleri. Şekil 1. Magaza veritabanının tabloları ve tablolar arasındaki ilişkiler

Bu uygulamayı yapabilmek için SQL Server'da Query Analyzer kullanabilmekle beraber, ADO.NET bilgisine sahip olmanız gerekir.

1. Hafta MS SQL Server 2008 Kurulum ve Tanıtımı BPR255 Veritabanı. Bu Derste Öğrenecekleriniz: Kurulum:

Transkript:

ORACLE BELLEK YÖNETĐMĐYLE ĐLGĐLĐ NOTLAR 1

İçindekiler 1. BUFFER CACHE... 3 2. SHARED POOL... 5 3. CHECKPOINT... 6 4. REDOLOG DOSYALARININ DEĞİŞİMİ... 8 5. ORACLE BELLEK YÖNETİMİ VE ÇÖKMEYE KARŞI GÜVENLİĞİ... 8 2

Bir tabloda sürekli olarak belirli satırları sorguluyor ya da değiştiriyorsanız, her seferinde diske gitmeniz mantıklı olmaz. Çünkü I/O maliyetli bir işlemdir. Bu yüzden bellek performans için can simididir. Sıkça okuduğunuz ya da sıkça değiştirdiğiniz şeyleri her seferinde diske yazmak ya da diskten okumak yerine bunu bellekte kotarabilirseniz, performansı arttırabilirsiniz. Bellekte çalışmak performans konusunda artış sağladığından Oracle da böyle yapar; diskte çalışmak yerine mümkün olduğunca belleği kullanır. Đşte bu yüzden bir sorguyu ikinci defa çalıştırdığınızda, sonuçlar daha hızlı gelir. Çünkü sorguda kullanılan block lar hâlâ 'sıcaktır' ve diske hiç gitmeden, direkt bellekten sonuç döner. Bellekte yer kalmadığında, daha sıcak (kullanım sıklığı daha fazla) olan block lar, soğuk (kullanım sıklığı daha az) block ların yerini alır. Oracle kapalı bir yazılım olduğundan arka plânda ne olduğunu elbette bilemiyoruz. Ama zekice yazılmış bir Least Recently Used LRU algoritmasıyla bu işin yapıldığını tahmin edebiliriz. Đşlemlerin bellekte gerçekleştirilmesi güzel bir olay. Ama bazı durumlarda (performans problemleriyle karşı karşıya kaldığımızda ya da testlerin daha tutarlı olması gerektiğinde) Oracle a bazı komutlarla müdahele etmemiz gerekir. Bu yazıda bizim için önemli bazı temel komutlardan ve Oracle a etkilerinden bahsedeceğiz. Önce üzerinde duracağımız komutları verelim, ardından bu komutların bellekte yaratacağı etkileri inceleyelim. a. ALTER SYSTEM FLUSH BUFFER_CACHE; b. ALTER SYSTEM FLUSH SHARED_POOL; c. ALTER SYSTEM CHECKPOINT; d. i. ALTER SYSTEM SWITCH LOGFILE; ii. ALTER SYSTEM ARCHIVE LOG CURRENT; 1. BUFFER CACHE Oracle da birçok şey sadece bellekte tamamlanıyor. Örneğin bir DML işlemi (insert, update, delete) yaptığınızda gidip veritabanı dosyalarına yazması gerekmez. Ya da bir sorgu çalıştırdığınızda, sorgu biter bitmez, veri saklayan block ların bellekten atılması gerekmez. Block lar sorgulara göre bellekte tutulabilir. Hatta çalıştırdığınız 3

sorgular, diske hiç erişmeden sonuç dönüyor olabilir. Bununla ilgili bir örnek üzerinden gidelim. Önce aşağıdaki gibi tabloyu yaratıyoruz: SQL> CREATE TABLE D_CCEBI.DENEME AS SELECT * FROM DBA_OBJECTS; Table created. Yarattığımız tabloda toplamda 72.526 kayıt var ve tablonun bulunduğu tablespace te her block 8K dan oluşuyor. DBA_SEGMENTS ten baktığımda tablonun 8.388.608 byte (8MB) kapladığını ve 1024 block tan oluştuğunu görüyorum. Tablo istatistiklerini topladığımdaysa, 1005 block görünüyor. (Block boyutunu 1K ya kadar indirip, PCTFREE değerini düşürebilseydik; bu ikisi arasındaki fark daha da ufak olabilirdi.) Sırada basit bir sorgu yazmak var: SQL> SELECT COUNT(*) FROM D_CCEBI.DENEME WHERE OBJECT_ID > 1000; COUNT(*) ---------- 71479 Şimdi de sorgunun ne kadar disk okuması yaptığına bakalım. SELECT a., A.DISK_READS, A.EXECUTIONS, A.BUFFER_GETS FROM V$SQL a WHERE a.sql_text LIKE '%SELECT COUNT(*) FROM D_CCEBI.DENEME WHERE OBJECT_ID > 1000%' 9szcxccznnfnq 1011 1 1134 Buradaki DISK_READS, okunan block sayısı; EXECUTIONS ifadenin kaç kere çalıştığı; BUFFER_GETS ise SQL ifadesi nedeniyle bellekten ne kadar block okunduğunu gösteriyor. Bunları daha iyi görebilmek için aynı sorguyu defalarca çalıştırıyorum: 9szcxccznnfnq 1011 33 32614 4

Sorguyu defalarca çalıştırdıktan sonra, EXECUTIONS sayısı arttığı hâlde DISK_READS artmıyor, fakat BUFFER_GETS ciddi bir artış gösteriyor. Yani SQL in diske gitmeden sürekli bellekten sonuç döndüğünü görebiliyoruz. Bu güzel bir özellik ama eğer bir SQL i test ediyor olsaydım, sonuçları sürekli bellekten okumak beni yanıltırdı. Bu gibi durumlar için bellekteki block ları boşaltmak daha doğru sonuçlar elde etmemi sağlar. Deneyelim, sorguyu tekrar çalıştıralım: SQL> ALTER SYSTEM FLUSH BUFFER_CACHE; 9szcxccznnfnq 1975 34 33600 Özetle FLUSH BUFFER_CAHCE yaparsanız; Bellekte tutulan block lar atılır. Dirty Buffers (değişime uğramış ama diske yazılmamış, bellekte tutulan block lar) diske yazılır SQL Plan bozulmaz SQL ile ilgili istatistikler silinmez Bu dediklerimi V$SQL_PLAN view ini sorgulayarak siz de görebilirsiniz: SELECT * FROM V$SQL_PLAN WHERE ='9szcxccznnfnq' AND ID=0; (* kullanacağınız sorguya göre değişiklik gösterecektir.) 2. SHARED POOL Đlk kez çalışan SQL ifadeleri hard parse yapılır. SQL ifadesi hash lenerek ona özel bir kimlik () verilir; ihtimaller hesaplanarak en uygun (cost u en düşük) plan belirlenir. Bu masraflı bir iştir; CPU ya maliyeti vardır. Bu yüzden plan tekrar tekrar hesaplanmaz. Aynı ifade söz konusu ise aynı plan üzerinden gidilir. Bu güzel bir özellik ama arada ciddi sorunlar ortaya çıkarıyor. Örneğin ilk hesaplanan plan, sonradan gelen ifadeler içinde geçerli olur. Şöyle düşünelim; bind değişken kullanan bir sorgu var. Ve ilk defa bu sorguyu kullanacağınızda çok geniş bir aralık verdiniz. Çok geniş aralık verildiğinde, önce 5

index lere gidip, sonra tablo block larına erişmek akıllıca olmayacaktır. Bu yüzden tabloya full gidecektir. Sizden sonra aynı ifadeyi kullanan fakat bind değişkenlerde çok kısa bir aralık veren ikinci bir sorgu gelebilir. Ve bu aralık ne kadar kısa olursa olsun, tabloya full yine full gidilecektir. Index leri kullandığında çok çok daha hızlı gidecek olmasına rağmen, ikinci bir defa plan hesaplanmayacağından bunun farkına varamaz. Bundan sonraki bütün ifadeler de böyle çalışacaktır. Bu gibi durumlardan sakınmak için shared pool u boşaltmak bir çözümdür: SQL> ALTER SYSTEM FLUSH SHARED_POOL; Yukarıda anlattıklarım zaten bilinen şeyler. Fakat göstermek istediğim bir durum var. Aşağıdaki sorguyu çalıştırırsanız artık sonuç boş gelecektir ki bu beklediğimiz bir şey. Çünkü SQL ID ve buna bağlı her şey gidiyor. SELECT a., A.DISK_READS, A.EXECUTIONS, A.BUFFER_GETS FROM V$SQL a WHERE a.sql_text LIKE '%SELECT COUNT(*) FROM D_CCEBI.DENEME WHERE OBJECT_ID > 1000%' no rows selected. Şimdi ilk sorgumuzu tekrar çalıştırıp, disk okumalarına bakalım: 9szcxccznnfnq 0 1 1016 Đlk defa çalıştırıldığı ve sql plan ilk defa hazırlandığı hâlde, hiç disk okuması yapılmıyor. Özetle FLUSH SHARED_POOL yaparsanız; Bütün SQL planları ve bellekte tutulan SQL bilgilerini atarsınız. Ancak bu buffer cache te tutulan data block larını etkilemez. Daha önce eriştiğiniz block lar hâlâ bellektedir. NOT: Shared Pool u boşaltmak gerekli olmadıkça yapılmamalı. Shared Pool u boşalttıktan sonra her sql için yeniden plan hesaplanacağından performans sorunu doğabilir. 3. CHECKPOINT Buffer cache ile shared pool arasındaki bağı ortaya çıkartınca, checkpoint konusuna değinmeden olmaz. Checkpoint dirty buffer ları diske yazmaya yarayan bir işlemdir. Yazının başında belirtmiştim, değişiklik olan data hemen diske yazılmaz; belirli 6

aralıklarda diske (veritabanı dosyalarına) çıkar. CHECKPOINT komutundan sonra, sql ifadesini birkaç kere çalıştırıp, yeni bir test yaptım: SQL> ALTER SYSTEM CHECKPOINT; 9szcxccznnfnq 0 5 4960 Gördüğünüz gibi dirty buffer ların diske yazılmasını sağlayan checkpoint, hot block ların bellekten atılmasına neden olmuyor. Peki başka bir şey deneyelim; okuma yaptığımız block larda değişiklik yapalım: delete from d_ccebi.deneme where object_id > 1000 and object_id < 50000; commit; 22925 rows deleted. Commit complete. SELECT COUNT(*) FROM D_CCEBI.DENEME WHERE OBJECT_ID > 1000; COUNT(*) ---------- 68191 Sorguyu birkaç kere çalıştırıp, disk okuma durumunu tekrar kontrol ediyoruz: 9szcxccznnfnq 0 10 9890 Kayıt silmeme rağmen, hiç disk okuması yapılmadı. Şimdi checkpoint yapalım, sorguyu tekrar çalıştırıp, duruma tekrar bakalım: 9szcxccznnfnq 0 11 9890 Bu noktada beklediğim sonuç gelmedi. Dirty buffer ı diske yazıyorsa,neden disk okuması yapmıyor diye düşündüm. Ancak aslında sonuçlar doğru. Çünkü dirty buffer i diske yazması, yazılan block ların bellekten atılmasına neden olmuyor. Özetle checkpoint yaparsanız; Dirty buffer olarak tabir edilen değişmiş block lar diske yazılır. 7

SQL Plan, bellekteki okuma amaçlı block lar bundan etkilenmez. 4. REDOLOG DOSYALARININ DEĞİŞİMİ ALTER SYSTEM SWITCH LOGFILE veya ALTER SYSTEM ARCHIVE LOG CURRENT komutları checkpoint yapar ve online redo log dosyasını değiştirir. Bu iki komut temelde aynı işi yapar (checkpoint atılması, redolog switch, arşive çıkılması vs...); ama aralarında önemli bir fark vardır. ALTER SYSTEM SWITCH LOGFILE redolog dosyasının değişmesini beklemez; işlemlerin bitmesine bakmadan size hemen döner. ALTER SYSTEM ARCHIVE LOG CURRENT ise daha güvenlidir, işlem gerçek anlamda tamamlanmadan size yanıt dönmeyecektir. Yalnız LOG CURRENT ifadesinde NOLOGGING mode da kullanamazsınız. 5. ORACLE BELLEK YÖNETİMİ VE ÇÖKMEYE KARŞI GÜVENLİĞİ Aslında Oracle ın bellek yönetimi arkasındaki felsefe basit. Yapabildiğin bütün işleri bellekte yap; yapamadıkların için diski kullan. Misal çok uzun süren işlemlerde, commit yapmasanız bile LGWR redo buffer içeriğini peyderpey redo log dosyalarına aktarır. Block lardaki değişikliği ise datafile lara yazar. Bir şeyin datafile a ya da redolog dosyasına yazılması, onun kalıcı olduğu anlamına gelmez. Siz ne zaman commit yaparsanız, değişiklik o zaman kalıcı olur. Ama kalıcı olan değişikliklerin de datafile larda bulunması gerekmez. Önemli olan redolog un commit ifadesini görmesidir. Gerektiğinde (mesela veritabanının aniden kapanması), redo log tan yapılan işlemler okunacak ve datafile a kaydedilmemiş dosyalar kaydedilecektir. Bu yüzden commit görmeyen büyük ifadeler çalıştırmaktan sakınmak lâzım. Bir çökme durumunda bütün iş tekrarlanacak, sonunda commit görmediğinden, yapılanlar geçersiz sayılacaktır. 8