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

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

تفاوت Local Index و Global Index در Oracle | راهنمای بهینه‌سازی ایندکس در جداول پارتیشن‌بندی‌شده

مقدمه : چرا شناخت ایندکس‌ها در Oracle اهمیت دارد؟

اگر با پایگاه داده Oracle کار می‌کنید، مخصوصاً در پروژه‌هایی با حجم زیاد داده، حتماً با اصطلاحاتی مانند Local Index و Global Index مواجه شده‌اید.

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

در این مقاله قصد داریم یک بررسی جامع از تفاوت‌های Local و Global Index در Oracle ارائه دهیم. همچنین شما را با سناریوهای کاربردی و نکات فنی برای انتخاب صحیح ایندکس آشنا خواهیم کرد.

اگر می خواهید در مورد تفاوت B-Tree Index و  Bitmap Index در اوراکل بیشتر آشنا بشید نوشته زیر را مطالعه کنید:

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

Local Index در Oracle چیست؟

Local Index ایندکسی است که برای هر پارتیشن جدول به‌صورت مستقل ایجاد می‌شود.

این نوع ایندکس با ساختار پارتیشن‌بندی جدول کاملاً همسو است.

مزایای Local Index:

  • عملکرد بالا در partition pruning

  • سرعت بالا در ساخت و مدیریت

  • مقاومت در برابر عملیات‌های مدیریتی مانند DROP/TRUNCATE پارتیشن

  • مناسب برای کوئری‌های بازه‌ای (مثلاً جستجوی داده در یک ماه خاص)

معایب:

  • عملکرد پایین‌تر در کوئری‌های گسترده که چندین پارتیشن را درگیر می‌کنند

  • عدم پشتیبانی از unique constraint سراسری

Global Index در Oracle چیست؟

Global Index یک ایندکس یکپارچه است که بدون توجه به پارتیشن‌بندی جدول، تمام داده‌ها را در سطح کل جدول ایندکس می‌کند.

مزایای Global Index:

  • مناسب برای کوئری‌های cross-partition

  • پشتیبانی از unique constraint کلی

  • عملکرد بهتر در کوئری‌های سنگین، join‌ها و گزارش‌گیری‌های سراسری

معایب:

  • نیاز به Rebuild در صورت حذف یا تغییر پارتیشن

  • سرعت پایین‌تر در ساخت نسبت به Local Index

  • پیچیدگی در نگهداری و مانیتورینگ

جدول مقایسه Global Index و Local Index

ویژگی Local Index Global Index
سطح ایندکس بر اساس هر پارتیشن سراسری (روی کل جدول)
پشتیبانی از uniqueness درون هر پارتیشن در کل جدول
عملکرد در Partition Pruning بسیار عالی متوسط
پایداری هنگام حذف پارتیشن بدون مشکل نیاز به Rebuild
مناسب برای کوئری‌های cross-partition خیر بله
نگهداری آسان‌تر پیچیده‌تر
سرعت ساخت سریع کندتر

چه زمانی از Local Index استفاده کنیم؟

  • وقتی کوئری‌ها معمولاً روی یک بازه زمانی خاص یا پارتیشن خاص اجرا می‌شوند

  • وقتی نیاز به عملیات مدیریتی مکرر روی پارتیشن‌ها دارید

  • برای عملکرد بالاتر در partition pruning

چه زمانی از Global Index استفاده کنیم؟

  • در تحلیل‌های سراسری یا گزارش‌گیری بین چندین پارتیشن

  • هنگام نیاز به enforce کردن unique constraint روی کل جدول

  • برای بهبود عملکرد در کوئری‌های join پیچیده

مثال واقعی از پیاده‌سازی Local و Global Index

ساخت جدول با پارتیشن‌بندی زمانی:

				
					CREATE TABLE sales (
  sale_id    NUMBER,
  sale_date  DATE,
  amount     NUMBER
)
PARTITION BY RANGE (sale_date) (
  PARTITION sales_2023_jan VALUES LESS THAN
  (TO_DATE('2023-02-01', 'YYYY-MM-DD')),
  PARTITION sales_2023_feb VALUES LESS THAN
  (TO_DATE('2023-03-01', 'YYYY-MM-DD'))
);

				
			

ساخت Local Index:

				
					CREATE INDEX idx_sales_local
ON sales(sale_date)
LOCAL;

				
			

ساخت Global Index:

				
					CREATE INDEX idx_sales_global
ON sales(sale_date)
GLOBAL;

				
			

کوئری‌ تست Partition Pruning:

				
					SELECT * FROM sales
WHERE sale_date BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD')
                    AND TO_DATE('2023-01-31', 'YYYY-MM-DD');

				
			

سوالات متداول درباره تفاوت بین Local Index و Global در اوراکل

Local Index فقط مربوط به یک پارتیشن خاص از جدول است و به‌صورت جداگانه برای هر پارتیشن ساخته می‌شود.

در مقابل، Global Index ایندکسی است که کل جدول را صرف‌نظر از پارتیشن‌بندی ایندکس می‌کند.

این تفاوت، روی کارایی، نگهداری و نحوه اجرا شدن کوئری‌ها تاثیر زیادی دارد.

بله، یکی از معایب مهم Global Index این است که در صورت انجام عملیاتی مثل DROP یا TRUNCATE روی پارتیشن، ایندکس ممکن است Invalid شود.

در چنین مواردی، لازم است ایندکس به‌صورت دستی بازسازی (Rebuild) شود.

در حالی‌که Local Index‌ها چنین مشکلی ندارند.

برای کوئری‌هایی که بازه‌های زمانی خاص (مثلاً یک ماه یا یک فصل) را هدف قرار می‌دهند، Local Index گزینه مناسب‌تری است.

زیرا Oracle فقط پارتیشن مرتبط را اسکن می‌کند (قابلیت partition pruning) و این موضوع باعث افزایش چشمگیر سرعت اجرای کوئری می‌شود.

بله، در Oracle هیچ محدودیتی برای استفاده هم‌زمان از Local و Global Index وجود ندارد.

در واقع، در بسیاری از سیستم‌های بزرگ، ترکیبی از هر دو نوع ایندکس برای رسیدن به بهترین عملکرد استفاده می‌شود؛ مثلاً Local Index برای کوئری‌های ساده و Global Index برای گزارش‌های پیچیده و cross-partition.

نتیجه‌گیری

درک تفاوت بین Local Index و Global Index در Oracle، یکی از کلیدهای موفقیت در طراحی دیتابیس‌های بزرگ است.

انتخاب درست می‌تواند بهبود چشمگیری در سرعت کوئری‌ها، پایداری سیستم و مصرف منابع ایجاد کند.

پیشنهاد ما:

  • از Local Index در سیستم‌های تحلیلی زمان‌بندی‌شده استفاده کنید

  • از Global Index در گزارش‌های کلان، عملیات join و نیاز به unique constraint سراسری بهره ببرید

💡 سوال شما درباره ایندکس‌های پایگاه داده چیست؟ در بخش نظرات بپرسید!

میثم راد

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

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

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