بهبود کارایی دستورات شرطی در 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>