همانطور که می دانید استفاده از تابع در یک دستور sqlای، context switch بین SQL engine و PL/SQL engine را در پی خواهد داشت و رخ دادن متعدد context switch می تواند اثرات منفی بر روی performance دیتابیس داشته باشد.
اوراکل در نسخه 21c برای افزایش سرعت اجرای این دسته از پرس و جوها، SQL Macros را معرفی کرده است که با استفاده از این قابلیت، متن پرس و جوی حاوی function به فرم ساده و بدون استفاده از function بازنویسی می شود.
در نسخه 23c هم اوراکل قابلیت Automatic SQL Transpiler را در این زمینه معرفی کرده است که در صورت تنظیم پارامتر sql_transpiler به مقدار ON، به صورت خودکار و بدون مداخله کاربر، تابع استفاده شده در متن دستور SQL «در صورت امکان» به SQL expression تبدیل خواهد شد تا از سربار ناشی از اجرای function در SQL کاسته شود.
تابع زیر را در نظر بگیرید:
create or replace function sal_func(sal_param number) return number is begin return sal_param +60 ; end; / Function created.
در صورت استفاده از این تابع به صورت زیر، در حالت پیش فرض تبدیلی اتفاق نمی افتد:
SQL> select sal from person where sal_func(sal)=570;
اما اگر از قابلیت Automatic SQL Transpiler استفاده کنیم، execution plan فوق تغییر خواهد کرد و تابع sal_func به عبارت SAL+60 تبدیل خواهد شد:
SQL> alter session set sql_transpiler = 'ON'; Session altered.
SQL> select sal from person where sal_func(sal)=570;
با تریس پرس و جوی فوق هم این مسئله قابل اثبات است:
*این قابلیت برای توابعی که در package تعریف شده اند کاربرد ندارد.