مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

انواع ایندکس ها در SQL Server

در این مطلب می‌خواهیم در مورد انواع ایندکس ها در Sql server صحبت کنیم و به طور مفصل تری انواع ایندکس را معرفی کنیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

1- ایندکس های Covering

این ایندکس از نوع non-clustered است با این تفاوت که از چند ستون ساخته شده است. این کار زمانی انجام می‌شود که جستجو و کوئری گرفتن بر اساس چند ستون باشد. با این کار تعداد عملیات IO کم می‌شود و سرعت کوئری بالا تر خواهد رفت. زیرا که لازم نیست که برای هر ستون یک جستجو در جدول اصلی انجام شود و فقط ستون‌ها در بخش ایندکس ها جستجو می شوند.در کد زیر نحوه ساختن این نوع ایندکس ها آورده شده است.

CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name 
   ON Production.Product (Name ASC,ProductNumber ASC);

همانطور که مشاهده می‌شود نحوه ذخیره سازی هرکدام از ستون‌ها در داخل ایندکس نیز مشخص شده است.

2- ایندکس با ستون‌های include شده

این ایندکس هم یک نوع از ایندکس های non-clustered است که می‌تواند چند تا از ستون‌های دیگر را نیز با خود همراه کند. دقت داشته باشید که در این نوع ایندکس فقط یک ستون به عنوان کلید قرار می‌گیرد ولی ستون هایی که در کوئری ها کاربرد دارند نیز به عنوان include به ایندکس اضافه می‌شوند. این ایندکس گذاری شبیه به روش covering است با این تفاوت که sql server به بعضی از انواع داده اجازه ایندکس شدن نمی‌دهد که می‌توان با استفاده از این روش آن‌ها را در ایندکس گنجاند تا سرعت کوئری ها بالا تر برود. اگر بخواهیم کد بالا را به شکل include شده بنویسیم کد حاصل به شکل زیر خواهد شد.

CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name
   ON Production.Product (Name ASC) INCLUDE (ProductNumber);

دقت داشته باشید که می‌توانید بیشتر از یک ستون را در include داشته باشید.

3- ایندکس های فیلتر شده

این ایندکس هم نوعی از ایندکس های non-clustered است که روی یک سری خاص از سطرهای جدول عمل ایندکس گذاری را انجام می دهد. مثالی ازکاربر این نوع ایندکس را  می‌توان یک جدول از محصولات یا کاربران زد. برای مثال یک جدول از کاربران وجود دارد که وقتی سیستم اقدام به حذف کاربر می‌کند ما کاربر را حذف نمی‌کنیم بلکه در داخل دیتابیس فیلد مربوط به حذف شدن آن را تغییر میدهیم. سپس در هر بار که اقدام به گرفتن لیست کاربران می‌کنیم همیشه شرطی را قرار می‌دهیم که کاربران حذف نشده را برای ما لود کند. حال می‌توانیم برای اینکه کاربران حذف شده در ایندکس گذاری قرار نگیرند از این نوع ایندکس استفاده کنیم. یعنی شرطی را برای ایندکس گذاری مشخص کنیم که سطرهایی که آن شرط را ندارند ایندکس گذاری نشوند. 

CREATE NONCLUSTERED INDEX IX_Not_Deleted_Users ON UserTable
(Username ASC) WHERE IsDeleted =0;

همچنین در همه نوع ایندکس گذاری از نوع non-clustered می‌توان مشخص کرد که ایندکسی که در حال ساختن آن هستیم unique باشد و عضو تکراری قبول نکند.

4- ایندکس های Column Store 

نوع جدیدی از ایندکس ها است که بیشتر در عملیات های DataWarehouse استفاده می‌شود. این روش از یک فرمت ستون محور(column based) برای ذخیره سازی اطلاعات استفاده می‌کند که هم میتوان ستون‌ها را به صورت clustered و هم به صورت non-clustered ذخیره نمود. این نوع ایندکس گذاری برای زمانهایی که مقدار داده‌های جدول بسیار زیاد است استفاده می‌شود. همچنین این روش قابلیت فشرده‌سازی اطلاعات را نیز دارد که می‌تواند حجم داده‌ها را تا 10 برابر فشرده تر کند. ولی مشکلی که این روش دارد این است که با برخی از انواع داده‌ها نمی‌تواند کار کند. برای مثال نوع داده‌هایی مثل varchar(max), nvarchar(max) ,text ,ntext , image قابل استفاده در این نوع ایندکس نیستند. همچنین اگر عملیاتی مانند replication در سرور خود راه اندازی کرده‌اید این روش برای شما مناسب نخواهد بود و بهتر است که از همان روش‌های سطر محور استفاده کنید.

CREATE CLUSTERED COLUMNSTORE INDEX CIX_TestData_TestType ON TestData.TestType 
  WITH (DATA_COMPRESSION = COLUMNSTORE);

5- ایندکس های xml

این نوع از ایندکس ها رو داده‌های xml ساخته می‌شوند. همانطور که می‌دانید sql server این قابلیت را دارد که بتواند ساختار داده‌های xml را تفسیر کند و از داخل داده‌ها کوئری بگیرد. این ایندکس برای بالابردن سرعت کوئری گرفتن از داده‌های xml کاربرد دارد.

CREATE PRIMARY XML INDEX PXML_TestData_TestData3 ON TestData (TestData3);

6- ایندکس Full_Text

یک نوع مخصوص از ایندکس گذاری است که برای کوئری های جستجوی متنی کاربرد دارد. این نوع ایندکس بر رو ستون‌های کاراکتری(رشته ای) و یا باینری عمل می کند.این نوع ایندکس با ایندکس گذاری های قبلی به کلی فرق دارد. این روش از کاتالوگ هایی برای ذخیره سازی رشته‌های ساختاری می‌سازد که در کاتالوگ های خاص نگهداری می‌کند. این نوع ایندکس برای نوع داده‌هایی مثل  varchar(max), nvarchar(max) ,text ,ntext که ستونهایی بسیار چاق را تولید می‌کنند و با بعضی روش‌ها نمی‌توان آن‌ها را ایندکس گذاری کرد بسیار مناسب است. این نوع ایندکس برای جستجوی عبارات متنی و کلمه ها بسیار سریع عمل می کند. همچنین می‌توان با استفاده از این ایندکس برای یک کلمه مترادف ها را نیز جستجو کرد. از معایبی که این روش دارد این است که این نوع ایندکس بر روی یک سرویس جدا اجرا می‌شود و اگر به درستی پیکربندی نشود می‌تواند حجم زیادی از منابع سیستم را آشغال کند. همچنین اگر به درستی پیکربندی نشده باشد کاتالوگ آن می‌تواند حجم زیادی از دیسک را نیز آشغال نماید و دیسک را مدت زیاد مشغول کند.

7- ایندکس های spatial

این نوع ایندکس ها برای نوع داده‌های geometry, geography کاربرد دارد و برای ایندکس گذاری مکانی مورد استفاده قرار می گیرد.با وب سایت tosinso همراه باشید


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات