1 Şubat 2013 Cuma

NUMBER VS. PLS_INTEGER


PL/SQL performans kazanımları ile ilgili makalelerde ve ORACLE dökümantasyonunda NUMBER tipi yerine PLS_INTEGER kullanılmasını tavsiye ediliyor. Sebebi de PLS_INTEGER machine arithmetic kullanıyor, yani native bir data tipi. NUMBER ve BINARY_INTEGER ise library arithmetic kullanıyor.


Aşağıdaki testi siz de yapabilirsiniz. Float vb. Özel durumu olmayan PL/SQL numeric data tipi olarak PLS_INTEGER kullanıyor olmamız performans açısından etkili olacaktır.

Sonuç:

Number islemleri icin gecen sure: 85
PLS_INTEGER islemleri icin gecen sure: 18

Test:

DECLARE
  l_pls_integer   PLS_INTEGER;
  l_pls_integer_2 PLS_INTEGER;

  l_number   NUMBER;
  l_number_2 NUMBER;

  l_pls_integer_start PLS_INTEGER;
  l_pls_integer_end   PLS_INTEGER;

  l_number_start PLS_INTEGER;
  l_number_end   PLS_INTEGER;

BEGIN

  ----------------------------------------------------------------
  -- pls_integer islemleri.

  l_pls_integer_start := dbms_utility.get_cpu_time;

  -- degiskene deger atama.
  FOR i IN 1 .. 10000000 LOOP
    l_pls_integer := i;
  END LOOP;

  --degiskenler arasi atama.
  FOR i IN 1 .. 10000000 LOOP
    l_pls_integer_2 := l_pls_integer;
  END LOOP;

  l_pls_integer_end := dbms_utility.get_cpu_time;

  ----------------------------------------------------------------
  -- number islemleri.

  l_number_start := dbms_utility.get_cpu_time;

  -- degiskene deger atama.
  FOR i IN 1 .. 10000000 LOOP
    l_number := i;
  END LOOP;

  --degiskenler arasi atama.
  FOR i IN 1 .. 10000000 LOOP
    l_number_2 := l_number;
  END LOOP;

  l_number_end := dbms_utility.get_cpu_time;

  dbms_output.put_line('Number islemleri icin gecen sure: ' ||
                       to_char(l_number_end - l_number_start));

  dbms_output.put_line('PLS_INTEGER islemleri icin gecen sure: ' ||
                       to_char(l_pls_integer_end - l_pls_integer_start));
END;

Hiç yorum yok:

Yorum Gönder