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

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

چگونه با Partitioning در Oracle سرعت کوئری‌ها را افزایش دهیم؟ | آموزش بهینه‌سازی SQL

مقدمه : چگونه Partitioning در Oracle می تواند سرعت کوئری‌ها را افزایش دهد؟

یکی از چالش‌های اصلی در مدیریت پایگاه داده‌های حجیم، کاهش زمان اجرای کوئری‌ها است.

Oracle Database ابزار قدرتمندی به نام Partitioning در اختیار ما قرار می‌دهد که می‌تواند کوئری‌ها را به‌طرز چشمگیری سریع‌تر کند.

در این مقاله، یاد می‌گیریم که چگونه با استفاده از Partitioning کوئری‌های بهینه و پرسرعت‌تری در Oracle بنویسیم.

اگر می خواهید با لیست کامل hints در اوراکل بیشتر آشنا بشید نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

Partitioning تکنیکی است که به شما اجازه می‌دهد جداول بزرگ را به بخش‌های کوچکتر (پارتیشن‌ها) تقسیم کنید.

این پارتیشن‌ها می‌توانند بر اساس تاریخ، مقدار عددی، محدوده مشخص یا لیست از مقادیر تعریف شوند.

Oracle هنگام اجرای کوئری می‌تواند فقط پارتیشن‌هایی که داده‌ی مرتبط دارند را اسکن کند و بقیه را نادیده بگیرد؛ این فرآیند به نام Partition Pruning شناخته می‌شود.

مزایای Partitioning در اجرای سریع‌تر کوئری‌ها

۱. Partition Pruning (هرس پارتیشن‌ها)

Oracle فقط پارتیشن‌هایی را بررسی می‌کند که شامل داده‌ی مورد نظر کوئری باشند. این باعث کاهش چشمگیر در مصرف منابع و زمان اجرا می‌شود.

🔹 مثال:

				
					SELECT * FROM sales
WHERE sale_date BETWEEN TO_DATE('2024-02-01','YYYY-MM-DD')
                    AND TO_DATE('2024-02-28','YYYY-MM-DD');

				
			

✅ اگر جدول sales بر اساس sale_date پارتیشن‌بندی شده باشد، فقط پارتیشن مربوط به فوریه اسکن می‌شود.

۲. ایندکس‌های محلی (Local Indexes)

هر پارتیشن می‌تواند ایندکس خودش را داشته باشد. بنابراین هنگام اجرای کوئری، فقط ایندکس پارتیشن مرتبط بررسی می‌شود و نه کل جدول.

۳. اجرای موازی کوئری‌ها (Parallel Execution)

Oracle می‌تواند چند پارتیشن را به‌طور همزمان و موازی اسکن کند. این ویژگی در جداول بزرگ بسیار حیاتی است و سرعت را تا چندین برابر افزایش می‌دهد.

۴. Joinهای بهینه‌تر (Partition-wise Join)

اگر دو جدول به‌صورت مشابه پارتیشن‌بندی شده باشند، Oracle قادر است هر پارتیشن از جدول اول را فقط با پارتیشن متناظر در جدول دوم جوین دهد.

این کار، مصرف حافظه و زمان اجرا را به‌شدت کاهش می‌دهد.

انواع Partitioning در Oracle

نوع پارتیشن توضیح کاربرد
RANGE بر اساس بازه مثل تاریخ یا اعداد گزارش‌های زمانی، داده‌های تاریخی
LIST بر اساس مقدار ثابت مثل کشور یا شهر داده‌های دسته‌بندی‌شده جغرافیایی
HASH پارتیشن تصادفی با الگوریتم Hash توزیع یکنواخت داده
COMPOSITE ترکیبی از چند نوع (مثلاً RANGE + HASH) برای سیستم‌های بزرگ و منعطف

مثال عملی از بهینه‌سازی کوئری با Partitioning

فرض کنید جدول sales با بیش از ۱۰۰ میلیون رکورد دارید:

				
					CREATE TABLE sales (
  id NUMBER,
  sale_date DATE,
  product_id NUMBER,
  sale_amount NUMBER
)
PARTITION BY RANGE (sale_date) (
  PARTITION p2023_01 VALUES LESS THAN 
  (TO_DATE('2023-02-01', 'YYYY-MM-DD')),
  PARTITION p2023_02 VALUES LESS THAN 
  (TO_DATE('2023-03-01', 'YYYY-MM-DD')),
  ...
);

				
			

اکنون کوئری زیر را اجرا می‌کنید:

				
					SELECT product_id, SUM(sale_amount)
FROM sales
WHERE sale_date BETWEEN TO_DATE('2023-02-01','YYYY-MM-DD')
                    AND TO_DATE('2023-02-28','YYYY-MM-DD')
GROUP BY product_id;

				
			

Oracle فقط پارتیشن فوریه را اسکن می‌کند → اجرای سریع‌تر، مصرف CPU و I/O کمتر

نکات مهم برای استفاده درست از Partitioning

نکته چرا مهم است؟
استفاده مستقیم از ستون پارتیشن در WHERE برای فعال شدن Partition Pruning
پرهیز از استفاده توابع روی ستون پارتیشن مثل TRUNC(sale_date) که مانع Pruning می‌شود
بررسی Execution Plan برای اطمینان از استفاده از پارتیشن‌ها
توجه به Bind Variables در برخی موارد می‌تواند مانع از Static Pruning شود

مزایای مدیریتی Partitioning

  • حذف یا آرشیو یک پارتیشن خاص بدون تأثیر روی کل جدول
  • بازیابی سریع‌تر اطلاعات از هر پارتیشن
  • بهینه‌سازی فضای ذخیره‌سازی
  • امکان ایجاد ایندکس‌های مستقل برای هر پارتیشن

سوالات متداول درباره (Partition Pruning) در اوراکل

Partitioning این امکان رو به Oracle می‌ده که فقط بخش خاصی از جدول رو که حاوی داده‌های مورد نظره اسکن کنه.

این کار باعث می‌شه که حجم داده‌های بررسی‌شده کاهش پیدا کنه و سرعت کوئری‌ها افزایش پیدا کنه.


به این فرآیند Partition Pruning گفته می‌شه و تأثیر بسیار زیادی روی عملکرد سیستم داره، مخصوصاً زمانی که جدول شما بسیار بزرگ باشه.

✅ ایندکس‌ها روی ستون‌های خاص برای جست‌وجوی سریع ساخته می‌شن، اما پارتیشن‌بندی کل جدول رو به بخش‌های کوچکتر تقسیم می‌کنه.

در واقع، ایندکس و پارتیشن دو تکنیک متفاوت هستن که می‌تونن با هم کار کنن. در خیلی از موارد، استفاده از هر دو هم‌زمان باعث بهترین عملکرد ممکن می‌شه.

✅ بهترین انتخاب برای داده‌هایی که به زمان حساس هستن، Range Partitioning هست.

در این روش، داده‌ها بر اساس بازه‌های زمانی (مثلاً ماهانه یا سالانه) به پارتیشن‌های مختلف تقسیم می‌شن.

این کار باعث می‌شه گزارش‌های ماهانه، سالانه یا مقایسه‌ای خیلی سریع‌تر اجرا بشن، چون Oracle فقط به همون بازه زمانی موردنظر نگاه می‌کنه.

❗ نه الزاماً. کوئری‌هایی که شرط WHERE شامل ستون پارتیشن نباشه یا به‌درستی نوشته نشده باشن، نمی‌تونن از Partition Pruning استفاده کنن.

همچنین استفاده از توابع خاص روی ستون پارتیشن (مثل تبدیل تاریخ) می‌تونه مانع بهره‌برداری از مزایای پارتیشن بشه.

برای بیشترین بازدهی، طراحی کوئری باید با توجه به ساختار پارتیشن‌بندی انجام بشه.

نتیجه‌گیری: آیا Partitioning ارزشش را دارد؟

پاسخ روشن است: بله، اگر با جداول بزرگ کار می‌کنید، Partitioning یکی از کلیدی‌ترین ابزارهای شما برای بهینه‌سازی کوئری‌ها خواهد بود.

ویژگی تأثیر
افزایش سرعت کوئری ✅ تا چند برابر سریع‌تر
کاهش مصرف منابع ✅ I/O و CPU کمتر
مقیاس‌پذیری بهتر ✅ کنترل بیشتر روی داده‌ها
نگهداری ساده‌تر ✅ حذف/آرشیو سریع داده‌ها

📢 نظر شما چیست؟ آیا تجربه‌ای در زمینه پارتیشن‌بندی دارید؟ در بخش نظرات با ما به اشتراک بگذارید! 🚀

 

میثم راد

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

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

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