آشنایی با Index در SQL Server
Index چیست؟
یک نوع شیء در پایگاه داده است که تاثیر مستقیم بر روی روند عملیات فیزیکی و منطقی خواندن و نوشتن داده ها دارد که در آخر تاثیری بر روی بازدهی Query مورد نظر می شود. دو نوع Index در محیط SQL Server وجود دارد. نوع اول Clustered و نوع دوم Non-Clustered. نوع اول ساختار جدول مورد نظر را به طور کلی از Heap به B-Tree یا ColumnStore تغییر می دهد بدون آنکه از داده های آن کپی برداری کند. نوع دوم داده های جدول مورد نظر را در ساختار جدیدی از نوع B-Tree یا ColumnStore کپی کرده و مدیریت می کند. در نظر داشته باشید که Index با نوع ساختار B-Tree دارای چندین لایه است به نام های Root , Intemediate , Leaf.
مزایای استفاده از Index
Clustered Index بازدهی سرعت تغییرات بر داده ها را از طریق تغییر ساختار جدول مورد نظر بالا می برد. زمانی که این Clustered Index بر روی جدول ساخته شود تمامی داده های موجود به صورت فیزیکی مرتب شده و در فایل پایگاه داده ذخیره می شود. نوع Non-Clustered Index سرعت بازدهی واکشی داده ها را بالا برده و احتمال به وجود آمدن Deadlock و Blocking را از طریق کپی کردن داده ها به حداقل می رساند. برای بازدهی بهتر در ساخت Index بهتر است که Clustered Index ها قبل از هر نوع Non-Clustered Index ها بر روی جدول ساخته شوند. توجه داشته باشید که Non-Clustered Index ها می توانند در یک دیسک سخت دیگری ساخته شوند تا سرعت بازدهی واکشی داده ها را بالا ببرند.
هزینه استفاده از Index
جدول پایگاه داده که دارای یک یا چند Non-Clustered Index است نیاز به حافظه و فضای دیسک سخت بیشتری دارد و به دلیل وجود این نوع Index ها عملیات ورود و تغییرات داده ها در جدول زمان بیشتر خواهد برد. مدیریت داده ها و تراکنشها در جداولی که داده های آنها در حال تغییر است زمانبر خواهد بود. پس در نتیجه وجود Clustered Index هزینه بیشتری نسبت به Non-Clustered Index دارد.
پیشنهادات برای طراحی یک Index
در زمان طراحی و ساخت یک Index شما نیاز به مشخص نمودن شرایط در واکشی دادها در Query های موجود هستید. این بسیار پیشنهاد می شود که شما از Narrow Index ها استفاده کنید به این صورت که نوع داده ای ستون مورد نظر برای ساختن Index باید از نوع عددی باشد و مقدار داده ها در ستون مورد نظر باید به صورت منحصربفرد باشند تا بازدهی واکشی داده ها با سرعت بالاتری انجام شود. از نوع داده ای کرکتری در Index شدیدا خودداری نمایید.
پیشنهادات برای طراحی یک Clustered Index
در صورت ممکن این نوع Index اول بر روی جدول ساخته شود. همانظور که گفته شد از Narrow Index برای بالا بردن بازدهی واکشی داده ها استفاده شود. این نوع Index را بر روی ستونهایی که مقدار داده ای آنها به طور مستمر و با مدت زمان کوتاهی تغییر می کند. اعمال عملیات Rebuild باید به صورت یک تراکنش انجام شود در غیر اینصورت تمامی Non-Clustered Index های مرتبط با جدول دوباره سازی خواهند شد و این امکان دسترسی به جدول را کم می کند.
پیشنهادات برای طراحی یک Non-Clustered Index
در این نوع Index می تواند بر روی ستونهایی که مقدار داده ای آنها به صورت مستمر و با زمان کوتاهی تغییر می کنند ساخته شود و نوع داده ای ستون می تواند از نوع کرکتری باشد. دیگر ستونهای مورد نیاز نیز می تواند در قسمت Include قرار گیرند تا از عملیات Key Lookup و یا RID Lookup جلوگیری شود.
فشرده سازی Index
فشرده سازی Index در SQL Server 2008 ارایه شد و فقط در نسخه Enterprise و Developer موجود می باشد. این قابلیت باعث کاهش حجم داده ها شده و تعداد عملیات I/O را کاهش می دهد که این باعث بالا رفتن سرعت بازدهی واکشی داده ها می شود. این قابلیت یک مقدار بر استفاده از حافظه اصلی و پردازنده تاثیر می گذارد. توجه داشته باشید که فقط لایه Leaf در Index فشرده می شود.
Index بر روی جداولی با Partition
یک جدول می تواند با قابلیت Partitioning به قطعات کوچک منطقی تبدیل شود و این باعث می شود که Index مورد نظر بر روی هر یک از قطعات یا قسمتهای جدول ساخته و به صورت جداگانه مدیریت شوند.