
اگر با دیتابیس Oracle کار میکنی—چه به عنوان برنامهنویس، چه DBA—حتماً اسم Shared Pool را زیاد شنیدی.
Shared Pool یکی از حیاتیترین بخشهای حافظه SGA است و دقیقاً همان جایی است که میتواند سرعت اجرای SQL را چند برابر کند یا برعکس، اگر درست مدیریت نشود، سیستم را کند و سنگین کند.
در این مقاله آموزش Oracle در بخش آموزش معماری اوراکل ، به شما توضیح میدهم که:
- Shared Pool دقیقاً چیست
- چطور با SQL کار میکند
- چطور با PL/SQL ارتباط دارد
- Hard Parse و Soft Parse یعنی چه
- چه چیزهایی در Library Cache ذخیره میشود
- چه اشتباهاتی باعث مصرف بیرویه Shared Pool میشود
- چطور عملکرد Shared Pool را بهتر کنیم
در بسیاری از سازمانها، پایگاه داده Oracle شامل اطلاعات بسیار حساسی است؛ اطلاعاتی مثل شماره کارت بانکی، شماره موبایل، حقوق کارکنان یا دادههای شخصی مشتریان.
در چنین شرایطی همیشه این سؤال مطرح میشود: آیا همه کاربران دیتابیس باید بتوانند این اطلاعات را بهصورت کامل ببینند؟
اوراکل برای حل این مسئله قابلیتی بسیار قدرتمند به نام Data Redaction ارائه کرده که از طریق پکیج DBMS_REDACT در دسترس است.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
Shared Pool چیست؟
Shared Pool جایی از حافظه Oracle است که وظیفهاش ذخیره و مدیریت SQL و PL/SQL است تا:
- اجرای کوئریها سریعتر شود
- پردازنده کمتر مصرف شود
- Parse دوباره انجام نشود
- Execution Planهای تولیدشده، دوباره استفاده شوند
به بیان خیلی ساده:
Oracle سعی میکند SQL هایی را که یکبار اجرا شدهاند، به خاطر بسپارد تا دفعه بعد همانها را سریعتر اجرا کند.
اجزای Shared Pool: همه چیز حول این دو بخش میچرخد
Shared Pool از دو بخش کلیدی تشکیل شده:
۱. Library Cache
جایی برای ذخیره کردن موارد زیر:
- SQL
- کدهای PL/SQL
- Execution Plan ها
- cursors
- metadataهای اجرایی
۲. Data Dictionary Cache
جایی برای ذخیره metadata شامل:
- جداول
- ستونها
- ایندکسها
- کاربران
- دسترسیها
این همان اطلاعاتی است که Oracle برای تحلیل SQL نیاز دارد.
ارتباط Shared Pool با SQL
وقتی تو یک SQL اجرا میکنی، Oracle یک پروسه چهار مرحلهای را طی میکند:
۱. دریافت SQL
مثلاً:
SELECT salary FROM employees WHERE employee_id = 100;
۲. جستجو در Shared Pool
Oracle دنبال SQL مشابه میگردد:
- اگر پیدا کند → Soft Parse
- اگر پیدا نکند → Hard Parse
۳. Parse کردن
در Hard Parse این کارها انجام میشود:
- بررسی Syntax
- بررسی دسترسی کاربر
- بررسی وجود جدول و ستون
- ساخت Execution Plan
- ذخیره کردن SQL در Library Cache
۴. اجرا
این کل جریان کار SQL در Shared Pool است و همین بخش است که یک دیتابیس را سریع یا کند میکند.
تفاوت Hard Parse با Soft Parse
Hard Parse
وقتی SQL برای اولین بار دیده میشود.
مشکلش:
- مصرف زیاد CPU
- کند شدن سیستم
- فشار بالا روی Library Cache
Soft Parse
وقتی SQL قبلاً در Shared Pool وجود دارد.
مزیت:
- سرعت بسیار بیشتر
- عدم نیاز به ساخت Execution Plan
مثال:
اگر سه بار این کوئری اجرا شود:
SELECT * FROM employees WHERE employee_id = 100;
بار اول → Hard Parse
دو بار بعدی → Soft Parse
اشتباه رایج: Literal SQL (قاتل Shared Pool)
اگر SQL به شکل literal نوشته شود:
WHERE id = 1
WHERE id = 2
WHERE id = 3
Oracle همه را SQL جدید میبیند، چون متن آنها با هم فرق دارد.
نتیجه:
- چندین Hard Parse غیرضروری
- رشد بیرویه تعداد cursor ها
- پر شدن Shared Pool
راهحل حرفهای:
استفاده از Bind Variable
SELECT * FROM employees WHERE employee_id = :id;
حالا Oracle این SQL را یک بار parse میکند و فقط مقدار :id تغییر میکند.
Shared Pool و PL/SQL: چرا PL/SQL همیشه سریعتر است؟
وقتی یک Procedure، Function یا Package را کامپایل میکنی، Oracle آن را داخل Library Cache میگذارد.
به همین دلیل:
- فقط یک بار کامپایل میشود
- دفعه بعد از حافظه اجرا میشود
- اجرای SQLهای داخل PL/SQL بسیار سریعتر است
مثلاً این Procedure:
CREATE OR REPLACE PROCEDURE get_salary(p_id NUMBER)
IS
v_salary NUMBER;
BEGIN
SELECT salary INTO v_salary
FROM employees
WHERE employee_id = p_id;
END;
فقط یک بار کامپایل میشود و چندین بار با سرعت بالا اجرا میشود.
PL/SQL مخصوصاً برای اپلیکیشنهایی که حجم زیادی SQL مشابه اجرا میکنند، واقعاً معجزه میکند.
Cursor چیست و چه نقشی در Shared Pool دارد؟
هر SQL در Shared Pool به صورت یک cursor ذخیره میشود.
Cursor شامل:
- متن SQL
- Execution Plan
- بایتکد PL/SQL (برای برنامهها)
- آمار اجرا (executions)
مشاهده آن:
SELECT sql_text, executions FROM v$sql;
مشکلات رایج Shared Pool
۱. Hard Parse زیاد
علت:
- عدم استفاده از bind variable
- اجرای زیاد dynamic SQL
- Shared Pool کوچک
راهحل:
- Bind Variable
- cursor_sharing مناسب
- افزایش shared_pool_size
۲. Library Cache Miss
علت:
- Purge شدن Cache
- fragmentation
۳. Shared Pool Fragmentation
علت:
- کوئریهای متنوع و زیاد
- پکیجهای سنگین PL/SQL
چگونه اندازه Shared Pool را بررسی کنیم؟
SHOW PARAMETER shared_pool_size;
تغییر اندازه:
ALTER SYSTEM SET shared_pool_size = 800M SCOPE=BOTH;
سوالات متداول درباره Shared Pool در اوراکل
Shared Pool جایی است که Oracle کوئریها و Execution Plan ها را در آن ذخیره میکند. وقتی یک SQL برای اولین بار اجرا میشود، Oracle باید آن را parse کند که این کار زمانبر است.
اما اگر همان SQL دوباره اجرا شود و در Shared Pool وجود داشته باشد، Oracle بدون parse مجدد از نسخه ذخیرهشده استفاده میکند.
این یعنی:
- CPU کمتر مصرف میشود
- سرعت اجرای کوئری بالا میرود
- Session ها کمتر منتظر میمانند
- Performance کلی دیتابیس بسیار بهتر میشود
به همین دلیل است که tuning کردن Shared Pool یکی از مهمترین کارهای یک DBA است.
سه دلیل اصلی Hard Parse بالا عبارتند از:
- استفاده نکردن از Bind Variableیعنی این SQL ها:
WHERE id = 10
WHERE id = 20
WHERE id = 30
برای Oracle سه statement متفاوتند.
استفاده از Dynamic SQL زیاد
مخصوصاً اگر متن SQL داخل برنامه تغییر کند.
Shared Pool کوچک
وقتی فضای کافی نباشد، Oracle مجبور میشود Cache را پاک (evict) کند.
Hard Parse زیاد باعث میشود:
- CPU بهشدت درگیر شود
- latency بالا برود
- Library Cache latch/mutex contention ایجاد شود
Library Cache یکی از بخشهای مهم Shared Pool است که موارد زیر را ذخیره میکند:
- متن SQL
- Execution Plan
- کد کامپایلشده PL/SQL
- اطلاعات cursor
- dependency های objectها
اهمیتش از این جهت است که:
- Parse کمتر انجام شود
- کوئریهای تکراری سریعتر اجرا شوند
- پکیجها و پروسیجرهای PL/SQL فقط یک بار کامپایل شوند
- برنامههای سنگین، load کمتری روی CPU بگذارند
اگر Library Cache خوب کار نکند، حتی بهترین سختافزار هم نمیتواند دیتابیس را سریع نگه دارد.
۳ تکنیک فوقالعاده مؤثر که تقریباً همه DBAهای حرفهای به آن تکیه میکنند:
استفاده از Bind Variable در همه SQL های تکرارشونده
این مهمترین عامل کاهش Hard Parse است.
افزایش اندازه Shared Pool و اتصال LRU مناسب
اگر Shared Pool کوچک باشد، Cache دائم تخلیه میشود.
استفاده از PL/SQL بهجای اجرای چندین SQL پشت سر هم
اجرای SQL داخل PL/SQL بسیار بهینهتر است چون Compilation فقط یکبار انجام میشود.
جمعبندی: Shared Pool قلب عملکرد SQL در Oracle است
Shared Pool جایی است که Oracle از آن برای:
- ذخیره SQL
- ذخیره PL/SQL
- نگه داشتن execution plan
- کم کردن Hard Parse
- افزایش سرعت اجرا
استفاده میکند.
اگر Shared Pool را خوب بشناسی و SQL را درست بنویسی،
در عمل میتوانی سرعت یک سیستم را چند برابر بهتر کنی.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید