Pages

25 Nisan 2012 Çarşamba

Oracle 11.2 sürümünde DBMS_PARALLEL_EXECUTE paketi


Oracle 11.2 sürümü ile yeni gelen DBMS_PARALLEL_EXECUTE prosedürü, büyük veri setlerini artalan şekilde güncellemeye izin veren bir pakettir. Temel olarak, ROWID veya nümerik kolon veya kullanıcı tabanlı SQL komutuna dayalı satırlara ayırarak daha küçük veri yığınları oluşturulur, ardından bu yığınlar paralel şekilde güncellenir.  Bu paketin avantajları ise; bu yığınlar bireysel olarak commit edilmektedir ve ROWID’e dayalı yığınlar olduğunda daha iyi performansa ulaşılmaktadır.   

DBMS_PARALLEL_EXECUTE neden önemlidir?

1.    Büyük bir tekil işlem birçok işlem yığınına bölünebilmektedir.
2.    Golden Date veya Streams gibi bağlı sistemlerde daha az etki yapmaktadır.
3.    Yığınlar ROWID ve bloklara bağlı olduğunda paralel DML işlemleri ile kıyaslandığında daha iyi performans göstermektedir.
4.    Daha az undo alanına ihtiyaç duyar ve bu sebeple ORA-01555 hatası ile karşılaşma ihtimali daha düşük olmaktadır.
5.    Hata ile karşılaşıldığında rollback işlemine etkisi şiddetli olmamaktadır.
6.    Kilit süresi daha düşüktür.
7.    Hatalı yığın işlemlerini yeniden başlatabilmektedir.
8.    Diğer paralel özelliklerin aksine, DBMS_PARALLEL_EXECUTE  paketi  Enterprise Edition lisansına şimdilik ihtiyaç duymamaktadır.
9.    Manuel kodlama gereksinimini azaltmakta ve paralel işlemler üzerinden daha iyi tekdüze dağıtım yapabilmektedir.

DBMS_PARALLEL_EXECUTE işlem adımları

1.    CREATE_TASK ile yeni bir görev oluşturulur.
2.    Aşağıdakilerden birini kullanarak istenilen boyutlarda yığınlar oluşturulur. 
CREATE_CHUNKS_BY_ROWID
CREATE_CHUNKS_BY_NUMBER_COL
CREATE_CHUNKS_BY_SQL
3.    Update komutu tanımlanır.
4.    Paralel çalışacak görev RUN_TASK komutu ile yürütülür.
5.    Hata işleme gerçekleştirilir ve RESUME_TASK ile hatalı yığınlar tekrardan çalıştırılır.

Aşağıdaki örnekte ilk adımda ilgili görev oluşturulmaktadır.

DBMS_PARALLEL_EXECUTE.CREATE_TASK (dbms_prl_task1);

Ardından ROWID’ye dayalı yığınlar oluşturulur. Örne şema HR ve tablo ise EMP tablosudur.

DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID (task_name => 
 dbms_prl_task1
, table_owner => HR
, table_name => 'EMP'
, by_row => TRUE
, chunk_size => 1000);

Son adımda ise oluşturulan yığınlar üzerinden 4 paralel proses ile çalışanların maaşlarını %10 artıran UPDATE işlemi alttaki gibi yapılmaktadır.

DBMS_PARALLEL_EXECUTE.
RUN_TASK (task_name => dbms_prl_task1
, sql_stmt => 'UPDATE HR.EMP e
  SET e.salary = e.salary *0.10
  WHERE rowid BETWEEN 1 AND 12000’
, language_flag => DBMS_SQL.native
, parallel_level => 4);

0 yorum:

Yorum Gönder