Oracle’da Bulk Binding ve Performans İncelemesi

Bu yazıda Oracle’da bulk binding yapısını, sık kullandığımız cursor yapısı ile parformans karşılaştırmasından bahsedeceğim.

Bulk Binding

 

Oracle PL/SQL bloklarını çalıştırmak için iki SQL engine’ninden faydalanır. Bunlardan biri procedürel sql bloklarını (PL/SQL) anlayıp, çalıştırmak için aksiyon alan PL/SQL Run Engine, diğeri ise doğrudan SQL cümlelerini çalıştıran SQL Engine’dir.

Procedural SQL kod blokları çalıştırdığımız her esnada bu iki engine arasında context switching işlemi gerçekleşir. Bunun nedeni açıktır, her prosedural kod bloğu en nihayetinde SQL cümleciklerinden oluştuğundan dolayı PL/SQL Run Engine’de atomik olarak ayrılan SQL cümleleri SQL Engine gönderilerek burada run edilmeye çalışılır. Üzerinde çalıştığımız kod prosedural bir blok olduğu için SQL engine’e gönderilen SQL cümlesinin çalıştıktan sonra üreteceği sonucun Prosedür tarafında anlamlı hale gelebilmesi için PL/SQL Run Engine’e gönderilmesi gerekmektedir. Yani En iyi hitimalle PL/SQL kod bloğumuz içerisinde bulunan her SQL statementımız için teorik olarak 2 kez Context switching işlemi yapıldığını görüyoruz.  Uzun PL/SQL kod bloklarını  yada LOOP içerisinde bulunan complex bir veri yapısı içeren  SQL statementlarımızı düşündüğümüz zaman Context Switching’e harcanan vaktin hayli fazla ve performansı olumsuz yönde etkileyici bir faktör olduğunu görmek çokta zor olmasa gerek.

Eğer yazdığımız PL/SQL bloklarında context switching işlemini ne kadar az yapmayı başarabilirsek sorgularımızın  performansınında benzer oranda  artacağı çok açık.  İşte tam bu noktada Bulk Binding operasyonu Oracle tarafından bizlere bu kapsamda sunulan bir opsiyon olarak karşımıza çıkıyor. Bulk Binding operasyonu tek bir SQL Engine çağırımında PL/SQL bloğunda var olan coollection’ın tamamını (array vb) SQL Engine’e gönderir.

Burada basit bir Örnekle anlatacak olursak 1000  elemanlı bir array’in  her elemanı için  döngü içindeki SQL’in dinamik olarak değiştiğini ve çalıştırılmak üzere SQL engine gönderildiğini düşünelim. Bulk Binding kullanmadan klasik Cursor mantığını kullanarak yaptığımızı düşünürsek  her SQL için 2 kez context switching yapılacağını totalde de 2000 kez context switching yapılacağını teorik olarak hesaplamamız mümkün Ancak bulk binding yapısından faydalanarak bu işlemi gerçekleştirdiğimizde Context Switching sayımız collection ı olduğu gibi gönderdiğimizden dolayı bir hayli düşecektir. Buda performansımızın artmasına neden olacaktır.

Bulk Binding deyiminin kullanımı aşağıdaki gibidir.

SELECT …..  BULK COLLECT INTO arrayName FROM ……

Bulk Collect ile Cursor arasındaki temel farkta bulk collect’in döndürdüğü sonucun bir array’e dolmasıdır. Cursorlardan bildiğimiz gibi cursorların sonucu bir array’e dolmamaktadır.

Şimdi basit bir örnekle  Cursor ve Bulk Binding’in performans incelemesini yapalım.

Bulk Binding

1.Yöntem

SET timing on

DECLARE
   TYPE mytype IS TABLE OF v$sql%ROWTYPE
      INDEX BY PLS_INTEGER;

   myvar   mytype;
BEGIN
   SELECT *
   BULK COLLECT INTO myvar
     FROM v$sql
    WHERE ROWNUM < 1000;

   FOR i IN myvar.FIRST .. myvar.LAST
   LOOP
      DBMS_OUTPUT.put_line (myvar (i).sql_id);
   END LOOP;
END;

/*  PL/SQL procedure successfully completed.
Elapsed: 00:00:01.14 */

2. Yöntem

SET timing on

DECLARE
   CURSOR mycur
   IS
      SELECT *
        FROM v$sql
       WHERE ROWNUM < 1000;

   myrec   mycur%ROWTYPE;
BEGIN
   FOR myrec IN mycur
   LOOP
      DBMS_OUTPUT.put_line (myrec.sql_id);
   END LOOP;
END;

/*  PL/SQL procedure successfully completed.
Elapsed: 00:00:08.19 */


Yaptığımız test’de de gördüğümüz üzere bulk binding kullandığımız  büyük collectionlarda performansı oldukça iyileşiyor.

 

Advertisements

About ... from Emrah METE

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

One Response to Oracle’da Bulk Binding ve Performans İncelemesi

  1. try says:

    tesekkurler, guzel paylasım

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