
مقدمه : Result Cache در Oracle Database چه کاربردی دارد؟
در دنیای پایگاه داده، مخصوصاً وقتی با سیستمهای پرترافیک کار میکنیم، یکی از دغدغههای اصلی اینه که چطور عملکرد کوئریها رو بهتر کنیم و فشار رو از روی دیتابیس برداریم.
خبر خوب اینکه اوراکل (Oracle Database) یه قابلیت خیلی کاربردی داره به اسم Result Cache که دقیقاً برای این مشکل ساخته شده.
در این مقاله آموزش اوراکل قراره خیلی ساده و کامل یاد بگیریم که:
✅ Result Cache چی هست
✅ چه موقع و چطور ازش استفاده کنیم
✅ چه مزایایی داره
✅ و در نهایت، با مثالهای واقعی در SQL و PL/SQL این مفهوم رو کامل جا بندازیم.
اگر می خواهید در مورد SGA و PGA در اوراکل با جزئیات بیشتری آشنا بشید نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
Result Cache چیست و چه کاری انجام میدهد؟
خیلی ساده بخوام بگم، Result Cache یعنی “ذخیره کردن نتیجه کوئری یا تابع در حافظه (Memory)”، طوری که اگر همون کوئری یا تابع بعداً دوباره اجرا بشه با همون ورودیها، دیگه نیازی نباشه Oracle دوباره محاسبه یا خواندن از دیسک انجام بده.
نتیجه از حافظه خونده میشه و در کسری از ثانیه بهت تحویل داده میشه!
📌 همین باعث میشه عملکرد خیلی بهتر بشه، به خصوص وقتی دادهها زیادن و کوئری یا تابع چند بار پشت سر هم اجرا میشه.
انواع Result Cache در Oracle
۱. SQL Result Cache
برای کش کردن نتایج کوئریهای SQL استفاده میشه. کافیه از یک hint مخصوص استفاده کنیم:
SELECT /*+ RESULT_CACHE */
department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;
✅ اوراکل این نتیجه رو در حافظه نگه میداره، و تا وقتی جدول employees تغییر نکنه، دفعههای بعدی سریعتر اجرا میشه.
۲. PL/SQL Function Result Cache
شما میتونی توی تعریف توابع PL/SQL، با یه خط اضافه (RESULT_CACHE
) خروجی تابع رو کش کنی:
CREATE OR REPLACE FUNCTION get_employee_name(p_emp_id NUMBER)
RETURN VARCHAR2
RESULT_CACHE
IS
v_name employees.first_name%TYPE;
BEGIN
SELECT first_name
INTO v_name
FROM employees
WHERE employee_id = p_emp_id;
RETURN v_name;
END;
بار اول تابع اجرا میشه و خروجی محاسبه میشه. دفعات بعد، تا وقتی داده تغییر نکرده باشه، تابع اصلاً اجرا نمیشه! و نتیجه از حافظه کش برمیگرده 🤯
تنظیمات مربوط به Result Cache در Oracle
میتونی تنظیمات کش رو با دستور زیر ببینی:
SHOW PARAMETER result_cache;
تنظیمات Result Cache
نام پارامتر | توضیح |
---|---|
result_cache_max_size | میزان حافظه اختصاص داده شده به کش |
result_cache_mode | حالت کش کردن (MANUAL یا FORCE) |
💬 اگر مقدار MANUAL
باشه، فقط زمانی کش انجام میشه که شما صراحتاً از RESULT_CACHE
استفاده کنید.
چه زمانی کش بیاعتبار (Invalidate) میشه؟
نتایج کششده تا وقتی معتبر میمونن که دادههای مرجع تغییر نکرده باشن.
اگر جدول یا دادهای که تابع ازش استفاده کرده تغییر کنه، کش بهصورت خودکار پاک میشه و دوباره ساخته میشه.
مثال عملی: تابع کششونده در PL/SQL
CREATE OR REPLACE FUNCTION get_dept_name(p_dept_id NUMBER)
RETURN VARCHAR2
RESULT_CACHE
IS
v_name departments.department_name%TYPE;
BEGIN
SELECT department_name
INTO v_name
FROM departments
WHERE department_id = p_dept_id;
RETURN v_name;
END;
حالا تستش کنیم:
-- avalin bar az Database mikhoone
SELECT get_dept_name(10) FROM dual;
-- Bare dovom az Hafeze Cache mikhoone.
SELECT get_dept_name(10) FROM dual;
پاکسازی دستی Result Cache (کش)
برای پاک کردن کش بهصورت دستی، مثلاً در تست یا دیباگ:
BEGIN
DBMS_RESULT_CACHE.FLUSH;
END;
/
حالا تستش کنیم:
⚠️ محدودیتهای استفاده از Result Cache
محدودیت | توضیح |
---|---|
جدولهای موقتی (GTT) | پشتیبانی نمیشوند |
توابع OUT یا IN OUT | نمیتوانند کش شوند |
وابستگی به context | باعث بیاعتباری کش میشود |
🎯 چه موقع از Result Cache استفاده کنیم؟
سناریو | مناسب هست؟ |
---|---|
کوئریهای پرتکرار با دادههای ثابت | ✅ عالی |
گزارشگیریهای read-only | ✅ مناسب |
دادههایی که زیاد تغییر میکنند | ❌ نه خیلی مفید |
سوالات متداول درباره Result Cache در اوراکل
بله! Oracle Result Cache به طور مستقیم باعث کاهش زمان اجرای کوئریها و توابع پرتکرار میشود.
با ذخیره نتایج در حافظه (RAM)، Oracle میتواند به جای اجرای مجدد کوئری، نتیجه را از کش بازگرداند، که در سیستمهای پرکاربرد یا گزارشگیری، تأثیر زیادی روی عملکرد دارد.
SQL Result Cache مخصوص ذخیره خروجی کوئریهای SQL است و با Hint مخصوص (/*+ RESULT_CACHE */
) فعال میشود.
اما PL/SQL Result Cache برای کش کردن خروجی توابع PL/SQL بهکار میرود و با نوشتن RESULT_CACHE
در تعریف تابع فعال میشود.
نه همیشه! اگر دادههای مرجع کوئری یا تابع زیاد تغییر میکنند، کش خیلی زود بیاعتبار میشود و عملاً استفاده از Result Cache فایده زیادی ندارد.
این قابلیت برای دادههای پایدار (نیمهثابت) مثل دپارتمانها، کشورها، تنظیمات و… مناسبتر است.
برای بررسی استفاده از Result Cache، میتوان از نمایشگرهای سیستمی استفاده کرد:
SELECT * FROM V$RESULT_CACHE_OBJECTS;
این ویو نشان میدهد چه کوئریها یا توابعی در حال حاضر در کش هستند. همچنین میتوان از DBMS_RESULT_CACHE
برای مدیریت و مشاهده جزئیات بیشتر استفاده کرد.
نتیجهگیری
اگر دنبال بهینهسازی عملکرد در اوراکل هستی، مخصوصاً در گزارشگیری، API یا پردازشهای پرتکرار، حتماً از Result Cache استفاده کن.
با کمی برنامهریزی و شناخت دقیق توابع و کوئریهایی که میتونن از کش استفاده کنن، میتونی مصرف منابع رو کاهش بدی و سرعت رو بالا ببری.
📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در استفاده از Result Cache دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید