ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

آموزش کامل استفاده از Result Cache در Oracle Database

مقدمه : 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 دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *