INDEX در دیتابیس اوراکل

INDEX یکی از OBJECTهای دیتابیس اوراکل است که می توان به منظور افزایش سرعت اجرای دستورات از آن استفاده نمود. ایندکسها روی ستون های جدول تعریف می شوند و معمولا آدرس فیزیکی رکورد(rowid) را هم در خود ذخیره می کنند(به استثنای ایندکسهای unique). زمانی که در دستورات SELECT و یا حتی در مواردی دستورات DMLای بر روی یک ستون از جدول برای دسترسی به سطر های خاص جستجو می شود میتوان با استفاده از rowid سرعت دستیابی به آن سطر را افزایش می یابد.

اگر در دستورات SQL برای یک ستون خاص از INDEX استفاده نشده باشد برای هربار دستیابی به داده های جدول بر اساس آن ستون، از عمل FULL TABLE SCAN استفاده می شود. یعنی به ترتیب تمام سطرهای جدول از دیسک به حافظه منتقل می شوند و توسط آن دستور SQL بررسی می شوند.

استفاده از INDEX سبب دسترسی مستقیم به سطرهای جدول می شود و عملیات I/O را کاهش می دهد.

 

روش ساخت INDEX

INDEXها مستقل از داده های یک جدول هستند. بنابراین می توان در هر زمان آنها را ساخت یا  DROP کرد. زمانی که یک جدول را DROP کنیم INDEX های وابسته به آن نیز DROP می شوند.

یک INDEX ممکن است به صورت اتوماتیک توسط دیتابیس اوراکل ساخته شود. همچنین هر کاربر می تواند به صورت صریح برای یک ستون از جدول INDEX بسازد. بنابراین دو دسته INDEX داریم:

UNIQUE INDEX: زمانی که در یک جدول یک ستون از نوع PRIMARY KEY یا UNIQUE KEY تعریف می شود دیتابیس اوراکل به صورت اتومالتیک یک INDEX برای این ستون ها با نام پیش فرض می سازد. توجه شود که این INDEXها را به روش دستی هم می توان ساخت ولی بهتر است اجازه دهیم دیتابیس این INDEX ها را بسازد.

NONUNIQUE INDEX: این دسته از INDEXها توسط کاربران برای ستون های جدول ایجاد می شوند تا سرعت دستورات SQL بهبود یابد.

در شکل زیر سینتکس ایجاد INDEX برای یک یا چند ستون از یک جدول را می بینید.

در این سینتکس اگر ستون های مورد نظر UNIQUE باشند می توان از کلمه UNIQUE استفاده کرد تا نوع INDEX نیز UNIQUE باشد.

مثال: برای ستون LAST_NAME یک INDEX بسازید.

نکته: می توان همزمان با ساخت جدول INDEXها را نیز ساخت.

مثال: در زمان ساخت جدول یک INDEX برای ستون EMPLOYEE_ID بسازید.

مثال: مشخصات INDEX مثال قبل را از دیتادیکشنری استخراج کنید.

نکته: می توان یک INDEX که UNIQUE نیست برای یک ستون که UNIQUE هست تعریف کرد و  از آن استفاده نمود.

مثال: ابتدا یک INDEX برای ستون EMPLOYEE_ID تعریف کنید. سپس این ستون را PRIMARY KEY کنید.

CREATE INDEX emp_id_idx2 ON

new_emp2(employee_id);

ALTER TABLE new_emp2 ADD PRIMARY KEY (employee_id) USING INDEX

emp_id_idx2;

 

INDEXهای از نوع FUNCTION-BASED

اگر در دستورات SQL برای یک ستون از جدول از توابع SQL استفاده شده است برای سرعت بخشیدن به این دستورات می توان INDEX آنها را از نوع FUNCTION-BASED تعریف کرد. یعنی تابع مورد نظر در INDEX تعریف شود. بنابراین دیتابیس اوراکل زمانی از این INDEX استفاده می کند که در دستورات از این تابع استفاده کرده باشیم.

مثال:  یک INDEX تعریف کنید تا در دستور زیر از آن استفاده شود.

 

انواع INDEXها

در دیتابیس اوراکل می توان INDEXها را به دو مدل B-TREE و BITMAP ساخت. در حالت پیش فرض یک INDEX با مدل B-TREE ایجاد می شود که مشابه ساختمان داده درختی است. در مقابل BITMAP را داریم که برای ستون هایی که دارای داده های تکراری زیادی  هستند مناسب تر است. اگر چه این دو مدل از لحاظ ساختار فیزیکی با هم متفاوت هستند ولی هردو به منظور افزایش سرعت دستورات SQL استفاده می شوند. برای تعریف یک INDEX با مدل BITMAP از کلمه BITMAP در سینتکس ساخت استفاده می شود.

نکته: می توان برای مجموعه ای از ستون ها(بیش از یک ستون) INDEX ترکیبی تعریف کرد.

نکته: می توان روی مجموعه ای از ستون ها(چند ستون) بیش از یک INDEX تعریف کرد به شرطی که:

–آن INDEX از لحاظ b-TREE یا BITMAP بودن متفاوت باشد.

–از لحاظ UNIQUE یا NON-UNIQUE بودن متفاوت باشد.

البته فقط یکی از این INDEXها را می توان به عنوان INDEX در دسترس یا VISIBLE تعیین کرد تا توسط دیتابیس استفاده شود.

مثال: دو INDEX ترکیبی روی ستون های FIRST_NAME و EMPLOYEE_ID تعریف کنید و یکی از آنها را VISIBLE کنید.

 

تغییر دادن یا حذف کردن INDEX

می توان با دستور DROP یک INDEX را حذف نمود.

مثال: INDEX را حذف کنید.

نکته: نمی توان با استفاده از دستور ALTER یک INDEX را تغییر دهیم. بلکه برای این منظور باید آن را DROP کرده و از ابتدا بسازیم.

نکته: اگر در زمان ساختن یا DROP کردن یک INDEX از عبارت ONLINE استفاده شود، عملیات DML می توانند همزمان با دستورات ما روی آن جدول اجرا شوند.

نکته: اگر یک جدول DROP شود، INDEXها و CONSTRAINT های آن جدول نیز DROP می شوند.

 

مشاهده اطلاعات INDEXها در دیتادیکشنری

دو دیتادیکشنری DBA_INDEXES و DBA_IND_COLUMNS اطلاعات اصلی هرکدام از INDEXهای دیتابیس را ذخیره می کنند.

مثال: اطلاعات INDEXهای جدول EMPLOYEES را نمایش دهید.

مثال: اطلاعات LNAME_IDX را نمایش دهید.

 

Comments (2)

  1. مثل همیشه عالی، ممنون میشم در مقاله جداگانه انواع ایندکس ها را و تفاوت اونها در عملکردشون را با جزییات بیشتر، توضیح بدین

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

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