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

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

Range Partitioning vs. Hash Partitioning – کدام نوع پارتیشن‌بندی در Oracle بهتر است؟

مقدمه : استفاده از کدام پارتیشن‌بندی در اوراکل مناسب تر است؟

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

دو نوع بسیار رایج و پرکاربرد پارتیشن‌بندی در Oracle عبارتند از:

  • Range Partitioning
  • Hash Partitioning

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

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

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

Range Partitioning چیست؟

Range Partitioning نوعی از پارتیشن‌بندی در Oracle است که در آن، داده‌ها بر اساس بازه‌های مقداری از یک ستون خاص (معمولاً DATE یا NUMBER) در پارتیشن‌های جداگانه قرار می‌گیرند.

📌 ویژگی‌ها:

  • مناسب برای داده‌های دارای ساختار زمانی یا ترتیبی
  • پشتیبانی کامل از Partition Pruning برای افزایش سرعت Query
  • آسان برای نگهداری، حذف یا آرشیو دوره‌ای داده‌ها

📘 مثال ساده:

				
					PARTITION BY RANGE (sale_date)
(
  PARTITION p2023_q1 VALUES LESS THAN 
  (TO_DATE('2023-04-01','YYYY-MM-DD')),
  PARTITION p2023_q2 VALUES LESS THAN
  (TO_DATE('2023-07-01','YYYY-MM-DD'))
)

				
			

Hash Partitioning چیست؟

در Hash Partitioning، داده‌ها به صورت تصادفی اما متعادل بین چند پارتیشن تقسیم می‌شوند.

این تقسیم‌بندی از طریق یک تابع Hash روی مقدار ستون انجام می‌شود.

📌 ویژگی‌ها:

  • مناسب برای داده‌هایی بدون ترتیب خاص (مثل ID کاربر، شماره حساب و…)
  • توزیع یکنواخت داده روی دیسک‌ها
  • مناسب برای پردازش موازی (Parallel Query / DML)

📘 مثال ساده:

				
					PARTITION BY HASH (customer_id) PARTITIONS 4
				
			

مقایسه Range و Hash Partitioning

ویژگی Range Partitioning Hash Partitioning
معیار تقسیم بر اساس بازه مقداری (مثلاً تاریخ) بر اساس تابع هش از مقدار ستون
قابلیت پیش‌بینی بالا – به راحتی قابل درک پایین – توزیع داده تصادفی است
عملکرد جستجو (WHERE) عالی – استفاده از Partition Pruning کمتر – ممکن است تمام پارتیشن‌ها بررسی شوند
توازن داده ممکن است نامتوازن باشد توزیع یکنواخت بین پارتیشن‌ها
مناسب برای داده‌های زمان‌محور یا ترتیبی داده‌های نامرتب یا پراکنده
حذف و آرشیو دوره‌ای ساده و مؤثر پیچیده‌تر
پشتیبانی از Parallel Query محدود عالی

کِی از Range استفاده کنیم؟

✔ زمانی که با تاریخ یا مقادیر ترتیبی کار می‌کنید
✔ زمانی که نیاز به گزارش‌های زمانی (مثلاً فروش ماهانه) دارید
✔ وقتی حذف یا نگهداری داده به صورت دوره‌ای اهمیت دارد
✔ وقتی شرط‌های WHERE به وضوح بر اساس تاریخ یا مقدار هستند

کِی از Hash استفاده کنیم؟

✔ وقتی داده‌ها الگوی مشخصی ندارند (مثل شماره مشتری)
✔ وقتی به دنبال توزیع یکنواخت بار هستید
✔ وقتی هدف شما افزایش توان موازی‌سازی عملیات است
✔ وقتی حجم داده بسیار بالاست و توازن در ذخیره‌سازی اهمیت دارد

سوالات متداول درباره پارتیشن بندی (Partitioning) در اوراکل

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

این تقسیم‌بندی باعث بهبود چشمگیر سرعت کوئری‌ها، ساده‌سازی نگهداری داده‌ها، کاهش زمان بکاپ و بهبود پردازش موازی (Parallelism) می‌شود.

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

بله، Oracle امکان استفاده از Composite Partitioning را فراهم می‌کند که در آن می‌توان ترکیبی از Range و Hash را پیاده‌سازی کرد.

مثلاً می‌توان داده‌ها را ابتدا بر اساس تاریخ (Range) تقسیم کرد و سپس هر پارتیشن را بر اساس شناسه کاربر (Hash) به زیرپارتیشن‌های یکنواخت تقسیم کرد. این ساختار برای سناریوهای حجیم و پیچیده بسیار مفید است.

نه الزاماً. پارتیشن‌بندی تأکیدش بیشتر روی عملکرد و نگهداری است، نه کاهش حجم دیتا.

اگرچه در برخی موارد می‌تواند باعث استفاده مؤثرتر از ایندکس‌ها شود، ولی پارتیشن‌بندی صرفاً ابزار فشرده‌سازی نیست.

البته Oracle امکان فشرده‌سازی داده‌ها در سطح پارتیشن‌ها را هم ارائه می‌دهد (مثل COMPRESS FOR QUERY).

بله! در پارتیشن‌بندی، انتخاب بین Local Index و Global Index اهمیت زیادی دارد.

  • ایندکس محلی (Local Index) برای هر پارتیشن به‌طور جداگانه ایجاد می‌شود و در عملیات‌های موازی و حذف پارتیشن، کارایی بالایی دارد.
  • ایندکس سراسری (Global Index) روی کل جدول اعمال می‌شود و در بعضی پرس‌وجوها سریع‌تر است، ولی نگهداری‌اش سنگین‌تر است.
    در طراحی حرفه‌ای، نوع ایندکس باید با نوع پارتیشن هماهنگ باشد.

نتیجه‌گیری

  • اگر ساختار داده‌ها قابل پیش‌بینی و مبتنی بر تاریخ یا بازه است، Range Partitioning گزینه بهتر و ساده‌تری خواهد بود.
  • اما اگر داده‌ها پراکندگی زیاد و غیرقابل پیش‌بینی دارند، و هدف توزیع متعادل و افزایش کارایی در پردازش موازی است، Hash Partitioning مناسب‌تر خواهد بود.

اگر هنوز مطمئن نیستید، Oracle این امکان را فراهم کرده تا با Composite Partitioning (ترکیب Range + Hash) از مزایای هر دو روش استفاده کنید!

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

 

میثم راد

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

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

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