Oracle Parallel Pipelined Functions

Herkese Selam,

Bugün sizlere Oracle’da Prosedürel Paralelliği sağlamanın yollarından biri olan Parallel Pipelined Fonksiyonlardan bahsedicem.

Parallel Pipelined fonksyonları anlatmaya başlamadan önce kısaca prosedürel işlem yapma alışkanlıklarımızdan ve bunların etkilerinden bahsetmek istiyorum.

Genellikle yazdığımız prosedürler veya fonksyonlarda sıra ile bir data çekeriz, daha sonra bu datayı satır satır transform edip, transforme ettiğimiz datayı tabloya insert ederiz yada ihtiyacımıza göre update ederiz. Aşağıdaki örnek pseudo kod bu durumu örneklendirmekte.

Create Procedure myProcedure()
as
begin

for record in (select …..) loop
— Transformation
— update or delete record from table
end loop;

end;

Genellikle db üzerinde parallel işlemler yapıp performans kazancı sağlamak isterken, fonksiyon veya prosedür kullanıldığı noktalarda parallelikten yeterince faydalanamadığımızdan dolayı performans anlamında dilediğimiz noktalara çıkamamaktayız.

Şimdi yukarıda örneğini göstermiş olduğum çalışma tarzı ile kısaca neleri paralleliştirip performansı nekadar değiştirebilirizi düşünelim, bakalım bu çalışma tarzı ile dilediğimiz performans kazanımlarını elde edebiliyormuyuz?

–> Öncelikle ilk paralleştirmeye çalıştığımız şey Cursor’ın içerindeki SQL’i paralleştirmek amacı ile Select cümlesine parallel hinti vermek olacaktır. Ancak bu işlemin tamamını paralleştirmediği için case’imiz için katlar mertebesinde bir kazanç sağlamayacaktır.

–> Diğer bir nokta ise yapacağımız insert’ü veya update’i paralleştirmek ancak döngü içinde olduğumuzdan dolayı herhangi bir anda elimizde tek bir satır olacağından dolayı bu noktayı paralleştirmek pekte mümkün gözükmemekte. Çünkü etki ettiğimiz kayıt sayısı döngü içindeyken 1 satır olacaktır ve seri çalışacaktır.

Her geçen gün işliyeceğimiz datanın arttığını düşündüğümüz durumda yukarıda sıraladığımız iyileştirmeler ile dilediğimiz mertebelerde parallelikten kazanç sağlayamayacağız aşikar. Adımları paralleştirmek performans anlamında bizi istediğimiz noktalara götüremediğinden  tüm fonksyonu paralleştirecek bir yol bulmamız gerekmekte. Bu yollardan biride Parallel Pipelined Function kullanmak.

Şimdi aşağıdaki örnek kod ile Parallel Pipelined Function’ların nasıl çalıştığını izah edelim.

İlk olarak aslında iş yapış şeklimizde biraz değişikliğe gitmek gerekmekte. Bu yüzden önce ilgilendiğimiz datayı transforme etmeden bir yere atıp sonra diğer işlemleri uygulamak performansımızı arttırıcı bir etken olmasının yanı sıra fonkyonlarımızı daha etkin kullanabilmemizide sağlamakta.

Şimdi örnek kodumuzu inceleyecek olursak  ilk dikkat çekeceğimiz nokta şüphesizki fonksyonumuzu paralelleştirecek söz deyimini yazdığımız PARALLEL_ENABLE söz deyimi ve burada yaptığımız partition tanımıdır. Burada yaptığımız partition tanımı ile gelen cursor’ın tanımladığımız kritere göre parçalara ayrılıp, ayrı bağımsız  sessionlarda fonksyonun paralel çalıştırabilesini olanak sağlanmaktadır. Gelen datayı partitionladığımız takdirde fonksyonuda paralel çalıştırabileceğimiz anlamını bu durumdan çıkarabiliriz. Buradaki partition işlemini 3 şekilde yapılabilir.  Buradaki gibi BY ANY söz deyimini kullanırsak parçalama işlemini Oracle’ın kontrolüne bırakmış oluyoruz, Oracle bu tercihle datayı overlap etmeyecek şekilde parçalara bölme işlemini gerçekleştiriyor. Uygulayabileceğimiz diğer yöntemlerde Hash ve Range yöntemleridir. Bu yöntemlerlede datayı partitionlamamız mümkün ancak burada  aksiyon bizde olduğu için  dikkat etmemiz gereken husus bölünen parçaların parçaların overlap etmemesi.

Şimdi begin end bloğumuza bakıcak olursak FOR içierisinde herhangi bir transformasyon ve operasyona girişmeden datamızı PIPE ROW söz deyimi ile fonksyonun çağırıldığı yere gönderildiğini görmekteyiz. Bu durumun birden çok avantajı söz konusu. Bu avantajlara bakıcak olursak.

a) Tüm datanın for içinde sonuna kadar bitmesini beklemeden biten parçaların hemen çağırlan yere gönderilerek hızlıca işlem görmesini sağlar

b)Örneğin 1 Milyon kayıt olan bir select’in satır satır işlendiği bir döngüde dolaştığımız durumu düşünürsek tüm kayıtların dönmesini beklemeden her satırı bittikçe işleme göndermek bize hem hız kazandıracak hemde memory kullanımımızı azaltacaktır.

PIPE ROW söz deyimi ile çalışma şeklimizi Producer-Consumer modeline dönüştürüp extra hız kazanmaktayız. Eğer Producer-Consumer modeli kullanmaz isek, bir işlemden diğer işleme geçireceğimiz datamızı ara tablolara alıp extra zaman kaybedicektik. Ara tablolara datayı taşımamızın ana nedenide tüm datanın memory üstünde durması ile memory üzerindeki kullanımızın çok fazla artmasıdır.  Aşağıdaki şekillerden parallel pipeline çalışma ile seri ve pipe kullanılmayan çalışma arasındaki fark daha net anlaşılmakta. (T1,T2,T3: Transformation işlemlerini belirtir, yani fonksyonlarımız ; Stage1,Stage2: Fonksyonlardan dönen sonuçların saklandığı ara tabloları gösterir.)

No Parallel, No Pipelined

Parallel ve Pipelined

Şekillerden de anlaşıldığı gibi paralel ve pipelined çalışma ara tablolara ihtiyaç duymadığından, ara tabloya yazma ve okuma maliyetleri olmamaktadır. Burdanda extra bir kazanç oluşmaktadır.

Şimdi aşağıdaki kod ile yukarıda yazdığımız fonskyonu nasıl kullnacağımıza bakalım.

Parallel Pipelined Fonksyonlar kullanarak yazacağımız uygulamalar gerek memory kullanımı açısından gereksede hız ve performans açısından oldukça iyi sonuçlar doğurmakta. Bu yöntem ile prosedürel gereksinimler yüzünden paralelden seriye düşen uygulamalarımızı iyileştirip performanslarını arttırabiliriz.

Kaynaklar :

“Expert Oracle Database Architecture 2011”, Tom KYTE,

tahiti.oracle.com,

http://docs.oracle.com/cd/E11882_01/server.112/e25523/parallel002.htm#i1014083

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Root, Uncategorized and tagged , , , , , , , , . Bookmark the permalink.

One Response to Oracle Parallel Pipelined Functions

  1. Pingback: Çalışma Zamanında Üretilen Dinamik Sorgu Sonuçlarının Performanslı Üretimi | Emrah METE

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s