مقدمه:

دستورات شرطی در زبان های برنامه نویسی از پر کاربردترین دستورات می باشند و عملا تصمیم گیری برنامه ها بر اساس همین دستورات می باشد. استفاده از این دستورات در مواقعی که با حجم بالایی از داده مواجه می شویم مشکل ساز خواهد بود، عملیات بررسی و تصمیم گیری در این شرایط زمان بر خواهد بود و این مسئله در همه زبان ها مطرح می باشد. با رعایت برخی نکات می توان این عملیات را بهبود بخشید.


بهبود کارایی دستورات شرطی در Oracle  PLsql

در این مستند یکی از این نکات به وسیله PLSQL مورد بررسی قرار خواهد گرفت.

کد Plsql و بررسی کارایی:

در دستورات شرطی، جایگاه بررسی شرط ها در کد در کارایی بسیار تاثیر گذار خواهد بود. هر چقدر در شرط های اولیه بتوان به نتیجه رسید زمان کمتری استفاده می شود
به کد زیر توجه کنید:

SET SERVEROUTPUT ON

DECLARE

  l_loops  NUMBER := 2000000;

  l_value  VARCHAR2(20) := ‘Tehran’;

  l_start  NUMBER;

BEGIN

  l_start := DBMS_UTILITY.get_time;

  FOR i IN 1 .. l_loops LOOP

    IF l_value = ‘Tehran’ THEN

      NULL;

    ELSIF l_value = ‘Isfahan’ THEN

      NULL;

    ELSIF l_value = ‘Shiraz’ THEN

      NULL;

    ELSIF l_value = ‘Tabriz’ THEN

      NULL;

    END IF;

  END LOOP;

  DBMS_OUTPUT.put_line(‘ELSIF first: ‘ ||

                       (DBMS_UTILITY.get_time – l_start));

  l_start := DBMS_UTILITY.get_time;

  FOR i IN 1 .. l_loops LOOP

    IF l_value = ‘Isfahan’ THEN

      NULL;

    ELSIF l_value = ‘Shiraz’ THEN

      NULL;

    ELSIF l_value = ‘Tabriz’ THEN

      NULL;

    ELSIF l_value = ‘Tehran’ THEN

      NULL;

    END IF;

  END LOOP;

  DBMS_OUTPUT.put_line(‘ELSIF last : ‘ ||

                       (DBMS_UTILITY.get_time – l_start));

END;

/

ELSIF first: 6

ELSIF last : 14

PL/SQL procedure successfully completed.

SQL>

همانطوری که مشاهده می فرمایید در حالت اول که در اولین دستور شرط برقرار می شود زمان کمتر از زمانی می باشد که در دستور آخر شرط برقرار می گردد.

این دستور را با CASE نیز بررسی می کنیم که نتیجه ای مشابه دارد.

SET SERVEROUTPUT ON

DECLARE

  l_loops  NUMBER := 2000000;

  l_value  VARCHAR2(20) := ‘Tehran’;

  l_start  NUMBER;

BEGIN

  l_start := DBMS_UTILITY.get_time;

  FOR i IN 1 .. l_loops LOOP

    CASE l_value

    WHEN  ‘Tehran’ THEN

      NULL;

    WHEN ‘Isfahan’ THEN

      NULL;

    WHEN ‘Shiraz’ THEN

      NULL;

    WHEN ‘Tabriz’ THEN

      NULL;

    END CASE;

  END LOOP;

  DBMS_OUTPUT.put_line(‘CASE first: ‘ ||

                       (DBMS_UTILITY.get_time – l_start));

  l_start := DBMS_UTILITY.get_time;

  FOR i IN 1 .. l_loops LOOP

    CASE l_value

    WHEN ‘Isfahan’ THEN

      NULL;

    WHEN ‘Shiraz’ THEN

      NULL;

    WHEN ‘Tabriz’ THEN

      NULL;

    WHEN ‘Tehran’ THEN

      NULL;

    END CASE;

  END LOOP;

  DBMS_OUTPUT.put_line(‘CASE last : ‘ ||

                       (DBMS_UTILITY.get_time – l_start));

END;

/

CASE first: 5

CASE last : 19

PL/SQL procedure successfully completed.

SQL>