ایندکس نان کلاستر چیست؟ - مقدمه

 در آموزش آشنایی با مفهوم و کاربرد ایندکس اشاره ای بر ایندکس نان کلاستر(nonclustered index) و کلیات آن داشتیم و در آموزش b-tree در sql server چیست نیز با ساختمان داده مورد استفاده جهت ذخیره سازی ایندکس در sql server و جزئیات مرتبط با آن آشنا شدیم. با توجه به نقش مهم ایندکس نان کلاستر در افزایش سرعت عملیات جستجو، معمولاً جداول در دیتابیس های عملیاتی دارای این نوع ایندکس هستند. تنها مواردی که می توان تصور کرد یک جدول در دیتابیس عملیاتی فاقد ایندکس نان کلاستر باشد عبارتند از:

1. در صورتی که جدول دارای ایندکس کلاستر باشد و

     a. نیاز به بازیابی تمام ستون های جدول در کوئری ها داشته باشیم

     b. همه  کوئری ها دارای شرط Where روی ستون کلید ایندکس کلاستر باشند.

     c. کم حجم بودن جدول و نیاز به وجود تنها یک ایندکس(در این حالت، وجود ایندکس کلاستر کفایت می کند)

2. در صورتی که جدول فاقد ایندکس کلاستر باشد و 

     a. نیاز به بازیابی تمام رکوردهای جدول در تمام  کوئری ها داشته باشیم!!!

     b. جهت تست و ...

در آموزش ایندکس چیست دیدیم که فهرست کتاب یک مثال خوب برای آشنایی با ایندکس نان کلاستر و کاربرد آن در افزایش سرعت جستجوی مطالب است. در آموزش ایندکس نان کلاستر چیست در ابتدا مراحل ایجاد ایندکس نان کلاستر بر روی یک جدول را خواهیم دید، به تفاوت های آن با ایندکس کلاستر می پردازیم و در ادامه نحوه جستجوی یک مقدار خاص با استفاده از این ایندکس را خواهیم دید. در طول آموزش، علاوه بر آشنایی با جدول HEAP و CLUSTERED و مفهوم Lookup، به نکاتی کاربردی پیرامون ایندکس نان کلاستر اشاره خواهد شد.


ایندکس نان کلاستر چیست؟ - معماری

هنگامی که برای فیلد/هایی از جدول، ایندکس نان کلاستر ایجاد می کنیم مراحل زیر انجام می شود:

     1. در فضایی جداگانه از جدول، یک b-tree ایجاد می شود.

     2. فیلد/های ایندکس نان کلاستر همراه اشاره گری به جدول اصلی، در b-tree درج می شود.

در شکل زیر نمایشی کلی از ایجاد ایندکس نان کلاستر روی فیلد فامیل از جدول employess را می بینیم(مثال فهرست کتاب و مطالب از آموزش ایندکس چیست را به خاطر بیاورید):

nonclusteredindex-preview

در ادامه قصد داریم جزئیات ساختار B-tree و اشاره گر ها که در شکل بالا بصورت یک باکس نمایش داده شده است را بررسی کنیم. این مورد را در حالتی که جدول دارای ایندکس کلاستر باشد و حالتی که جدول فاقد ایندکس کلاستر است بررسی می کنیم.

1. ایجاد ایندکس نان کلاستر روی جدول فاقد ایندکس کلاستر:

نکته مهمی که در مورد ایندکس نان کلاستر باید به آن توجه داشته باشیم، وجود اشاره گرها به جدول اصلی است که row locator نامیده می شود. به عبارتی با توجه به اینکه ایندکس نان کلاستر در فضایی مستقل از جدول اصلی نگهداری می شود می بایست یک آدرس برای مراجعه از ایندکس نان کلاستر به جدول اصلی جهت واکشی اطلاعات تکمیلی وجود داشته باشد(مانند شماره صفحه در فهرست کتاب جهت مراجعه به مطالب اصلی آن). در حالتی که جدول فاقد ایندکس کلاستر باشد، شماره صفحه به همراه محل رکورد در آن صفحه به عنوان اشاره گر(row locator) در سطح برگ(Leaf) از b-tree مربوط به ایندکس نگهداری می شود.

nonclustered-index-over-heap

در شکل بالا یک ایندکس نان کلاستر بر روی فیلد فامیل از جدول Employees که دارای 16 رکورد و 4 صفحه(Page) است ایجاد کرده ایم. در اولین مرحله از ایجاد ایندکس نان کلاستر سطح برگ را ایجاد می کنیم، برای این کار مقدار موجود در فیلد فامیل رکوردها به ترتیب صعودی(پیش فرض) به سطح برگ از b-tree منتقل می شوند. فرض می کنیم در هر صفحه از سطح برگ b-tree تنها 4 رکورد ذخیره می شود.

همانطور که در شکل مشخص شده است، در کنار هر فامیل، شماره صفحه و شماره ردیفی از صفحه، که این فامیل در آن قرار دارد آورده شده است. به عنوان نمونه فامیل "احمدی" در صفحه دوم و ردیف چهارم قرار گرفته است. بنابراین زمانی که به فامیل "احمدی" در سطح برگ برسیم می دانیم که برا ی استخراج اطلاعات تکمیلی(نام و ...) باید به صفحه دوم و رکورد چهارم آن صفحه مراجعه کنیم. پس از تکمیل سطح برگ، در ادامه سطوح میانی و ریشه از b-tree را تکمیل می کنیم به اینصورت که در ابتدا از هر صفحه، اولین(کوچکترین) مقدار را به سطح بالایی منتقل و یک اشاره گر به صفحه حاوی آن مقدار ایجاد می کنیم: 

nonclustered-index-over-heap-sample

what-is-nonclustered-index-notice1نکته: به جدولی که ایندکس کلاستر نداشته باشد، HEAP گفته می شود. در مثال بالا جدول Eployees یک جدول HEAP است.

در ایندکس نان کلاستری که بر روی یک جدول heap ایجاد شده است row locator را RID یا Row IDentifier می نامیم که از سه قسمت شماره فایل، شماره صفحه و شماره ردیف تشکیل شده است (در تصویر بالا، تنها شماره صفحه و شماره ردیف نمایش داده شده اند). به عنوان نمونه یک RID بصورت 4:703:06 به این معناست که رکورد مربوطه در فایل شماره 4 از جدول و صفحه 703 از این فایل و رکورد 6ام از صفحه قرار گرفته است.

شکل زیر مراحل لازم جهت استخراج اطلاعات فردی با فامیل "بندامیر" را نمایش می دهد(نحوه جستجو، در آموزش b-tree چیست توضیح داده شده است):

nonclustered-index-search

what-is-nonclustered-index-notice2نکته: در ایندکس نان کلاستر، بعد از رسیدن به سطح برگ(leaf) در صورت نیاز به استخراج اطلاعات بیشتر، باید به جدول مراجعه کنیم که به این عملیات lookup گفته می شود.

با توجه به نکته فوق، خط سبز رنگ در شکل بالا، یک lookup محسوب می شود. با توجه به اینکه در سطح برگ از ایندکس نان کلاستر، تنها مقدار فامیل موجود است و ما نیاز داریم تا اطلاعاتی مانند نام و کدملی را نیز استخراج کنیم پس باید به جدول مراجعه کنیم. در واقع lookup مانند مراجعه از فهرست کتاب به صفحات اصلی آن، جهت مطالعه مطالب بیشتر است.

2. ایجاد ایندکس نان کلاستر روی جدول دارای ایندکس کلاستر:

زمانی که ایندکس نان کلاستر را بر روی جدول دارای ایندکس کلاستر ایجاد کنیم. دو تفاوت عمده نسبت به حالت قبل وجود دارد. اول اینکه در این حالت row locator برابر است با کلید ایندکس کلاستر(Index Key) یعنی به ازای هر مقدار در ایندکس نان کلاستر، کلید ایندکس متعلق به آن مقدار نیز اضافه می شود. دومین تفاوت مربوط می شود به نحوه جستجوی اطلاعات که در این حالت با رسیدن به سطح برگ از ایندکس نان کلاستر بایستی یک جستجود در b-tree متعلق به ایندکس کلاستر انجام دهیم. 

جهت مشخص شدن این دو تفاوت، در ابتدا یک ایندکس کلاستر روی فیلد ID از جدول Employees ایجاد می کنیم(آموزش ایندکس کلاستر چیست را ببینید) و در ادامه با ایجاد یک ایندکس نان کلاستر بر روی فیلد فامیل، ساختاری مطابق شکل زیر خواهیم داشت:

nonclustered-index-over-clustered

 همانطور که در تصویر بالا مشخص است از مقدار کلید ایندکس کلاستر هر رکورد، به عنوان row locator استفاده شده است. به عنوان مثال مقدار ID(کلید ایندکس کلاستر) رکورد دارای فیلد فامیل "بندامیر" برابر است با 5 که در سطح برگ از ایندکس نان کلاستر اضافه شده است.

what-is-nonclustered-index-notice3نکته: به جدولی که ایندکس کلاستر داشته باشد، clustered گفته می شود. در مثال بالا جدول Eployees یک جدول clustered table است. 

شکل زیر مراحل لازم جهت جستجوی مشخصات فردی با فامیل "بندامیر" را نمایش می دهد:

nonclustered-index-over-clustered-search

پس مراحل جستجو در یک ایندکس نان کلاستر که بر روی یک جدول Clustered ایجاد شده باشد شامل پیمایش دو b-tree است. همانطور که در شکل بالا مشخص است برای یافتن مشخصات فردی با فامیل "بندامیر" در ابتدا لازم است b-tree مربوط به ساختار ایندکس نان کلاستر را پیمایش کنیم تا به سطح برگ برسیم و در ادامه با استفاده از کلید ایندکس(row locator) به b-tree مربوط به ایندکس کلاستر مراجعه و با جستجو در آن، اطلاعات مورد نظر را استخراج کنیم. فلش سبز رنگ در تصویر بالا نیز به عنوان lookup شناخته می شود.

nonclustered-index-over-clustered-lookup

what-is-nonclustered-index-notice4نکته: عملیات lookup تنها در ایندکس نان کلاستر رخ می دهد و به دو نوع RID Lookup و Key Lookup تقسیم می شود.

زمانی که lookup از ایندکس نان کلاستر به یک جدول heap انجام شود به آن RID Lookup می گوییم و اگر lookup از ایندکس نان کلاستر به یک جدول clustered(دارای ایندکس کلاستر) رخ دهد به آن Key Lookup می گوییم. بنابراین lookup مثال اول(ایندکس نان کلاستر روی جدول بدون ایندکس کلاستر) از نوع RID Lookup(خط سبز رنگ) و در مثال دوم(ایندکس نان کلاستر روی جدول دارای ایندکس کلاستر) از نوع Key Lookup(فلش سبز رنگ) است.


ایندکس نان کلاستر چیست؟ - جمع بندی

همانطور که در ابتدای آموزش اشاره شد جداول جهت افزایش کارایی در استخراج رکوردها، معمولاً نیاز به ایندکس نان کلاستر دارند. آشنایی با معماری ایندکس نان کلاستر و نحوه درج و جستجوی اطلاعات در آن علاوه بر اینکه در طراحی کوئری بهینه به ما کمک می کند، در درک بهتر آموزش های آتی مانند: ایندکس گذاری صحیح، کشف ایندکس های تکراری، page split و ... به عنوان یک پیش نیاز محسوب می شوند. در آموزش ایندکس نان کلاستر چیست علی رغم اینکه موضوع اصلی آموزش پرداختن به معماری این ایندکس بود اما متناسب با موضوعات به مواردی مانند جداول heap و clustered نیز پرداخته شد و با مفهوم lookup و انواع آن نیز آشنا شدیم. در آموزش های آتی (مجموعه افزایش سرعت و کارایی) به مقایسه سرعت و کارایی دو جدول heap و clustered می پردازیم و همچنین ایندکس های کلاستر و نان کلاستر را از نظر سرعت مقایسه خواهیم کرد.