دستور create index در SQL
دستور CREATE INDEX برای ایجاد INDEX (شاخص) در جداول استفاده می شود.
شاخص ها به پایگاه داده این اجازه را می دهند که داده ها را سریع پیدا کنند. بدون اینکه تمام جدول را بخواند.
INDEX
یک شاخص می تواند در یک جدول برای پیدا کردن آسانتر و مؤثرتر داده ها ایجاد شود.
کاربران نمی توانند INDEXها را ببینند ، آنها تنها برای سریعتر کردن جستجوها کاربرد دارند.
توجه: به روز رسانی (Update) یک جدول با INDEX زمان بیشتری نسبت به جدول بدون INDEX می برد. (زیرا INDEXها خود نیاز به، به روز رسانی دارند) بنابراین تنها روی ستونهایی (و جداولی) INDEX ایجاد کنید که به تناوب روی آن ها جستجو انجام خواهد شد.
فرم دستور CREATE INDEX:
ایجاد یک شاخص در یک جدول، تکرار داده ها مجاز است.
ON table_name (column_name)
فرم دستور CREATE UNIQUE INDEX:
ایجاد شاخص یکتا در جدول، تکرار داده ها مجاز نمی باشد.
ON table_name (column_name)
توجه: فرم دستور ایجاد INDEX در پایگاه داده های مختلف با یکدیگر تفاوت دارد . بنابراین فرم این دستور را در پایگاه داده خود چک کنید.
مثال:
دستور زیر یک شاخص با نام PIndex را روی ستون LastName در جدول Persons ایجاد می کند.
ON Persons (LastName)
اگر می خواهید یک شاخص را روی مجوعه ای از ستون ها تعریف کنید، می توانید نام آن ستون ها را در یک پرانتز بنویسید و آنها را با کاما از هم جدا کنید.
ON Persons (LastName, FirstName)
- نوشته شده توسط مهندس تمیزی
- بازدید: 29253
دیدگاهها
سلام...تو اين قسمت به ايندكس اشاره شده ولي نگفتين كه چطور به جستجو كمك ميكنه!يعني موقع جستجو چطور بايد ازش استفاده كرد
سلام، در مورد ایندکس به موارد زیر توجه فرمایید:
1- تنها روی فیلدهایی که مطمئن هستید، جستجو مکرراً روی آنها انجام می شود ایندکس گذاری کنید.
2- در جدولی که ایندکس در نظر گرفته شده است، زمان عملیات های درج، ویرایش و حذف نسبت به جدولی که ایندکس گذاری ندارد بیشتر خواهد بود و این بخاطر به روز کردن ایندکس ها زمان عملیات های مذکور است. بنابراین با دقت بیشتری ایندکس گذاری کنید.
3- به ازای هر ایندکس یک ساختار درختی خارج از جدول ایجاد می شود که نگهداری آن هزینه بر خواهد بود.
4- کلید جدول نیز یک نوع ایندکس است.
5- اگر محدودیت unique یا منحصر به فرد بودن را برای یک فیلد تنظیم کنید، باز یک ایندکس ایجاد خواهد شد.
و اما جواب سوال شما ...!
همان طور که گفته شد به ازای هر ایندکس یک ساختار درختی ایجاد می شود. اگر به نحوه ی ساخته شدن این درخت توجه کنید، به این سوال که ایندکس ها چگونه جستجو را سریع تر می کنند خواهید رسید.
فرض کنید روی فیلد f1 یک ایندکس تنظیم شده است. حالا با توجه به عکس زیر، برای ساخته شدن ایندکس مراحل زیر انجام می شود:
1- مرتب کردن مقادیر داخل f1 و قرار دادن آنها در leaf level یا سطح برگ
2- برای ساخته شدن سطح میانی یا intermediate level هر دو node در سطح پایننی در نظر گرفته می شود و مقدار اول و آخر از این دو node در سطح بالایی استفاده خواهد شد. (بعنوان مثال node اول از سمت چپ که از 1-25 در آن قرار دارد را با node کناری آن که از 26-50 در آن قرار دارد در نظر بگیرید، برای ساخته شدن سطح میانی مقدار اول از node یک یعنی 1 و مقدار دوم از node دو یعنی 50 در نظر گرفته می شود و سطح میانی با مقدار 1-50 ایجاد می شود.) این روش ادامه پیدا می کند تا به root یا ریشه درخت برسیم.
حالا به کوئری زیر توجه نمایید:select f1 from table01
where f1=53
بدلیل اینکه روی f1 ایندکس تعریف شده است، پایگاه داده ابتدا بصورت اتوماتیک به سراغ ساختار درختی می رود. و با 4 حرکت f1 را برمی گرداند:
1- از root شروع می کند. "53" بین 1-200 است.
2- در سطح دو یک مقایسه می کند، آیا "53" بین 1-100 است یا بین 101-200 مصلماً بین 1-100 است پس برای رسیدن به "53" مسیر 1-100 را ادامه می دهد.
3- در سطح سه دوباره مقایسه ای بین 1-50 و 51-100 انجام می دهد و اینبار مسیر را از 51-100 ادامه می دهد.
4- در سطح چهار نیز مانند بالا، مقایسه ای بین 51-75 و 76-100 انجام می دهد و نهایتاً به داده هایی که در 51-75 است می رسد. در این مرحله یکی یکی داده های node را می خواند تا به "53" برسد.
توجه: اگر برای فیلد f1 ایندکس گذاری تعریف نشده بود برای رسیدن به "53" از مقدار 1 شروع به مقایسه می شد تا به "53" برسد. که در اینجا به 53 مقایسه نیاز بود...! اما در مثال بالا، با عددی بسیار کمتر به "53" رسیدیم.
با مثالی که شما زدین ایندکس رو روی آی دی یا مثلا شماره فاکتور باید بگداریم درست است؟؟؟
در مثال شما محدوده گره بالایی در گره پایینی نصف میشه این قانون از کجا اومده نمی شه به شکل دیگه ای گره ها رو درست کرد مثلا تمام اعداد زوج در یک گره و فرد در گرهی دیگر و به همین ترتیب...
من یه خورده گیج شدم.
حالا که ما ایندکس کردیم چه طور باید از این ایندکس استفاده کنیم یعنی با چه دستوراتی باید واکشی کنیم از دیتا بیس؟؟
1- 1- ایندکس باید روی فیلدی قرار بگیرد که جستجو روی آن زیاد است، مثلاً شماره فاکتور، موردی است که خیلی زیاد روی آن جستجو انجام می شود.
2- همان طور که گفتم، برای ساخت ایندکس روی فیلد f1، ابتدا داده های فیلد f1 مرتب می شوند و در پایین ترین سطح درخت قرار می گیرند، شاید این سوال براتون پیش بیاد که بر چه اساس از شماره 1 تا 25 در نود اول قرار می گیرد ...!؟ در اینجا بحث بسیار تخصصی می شه و باید با مفهوم Page در بانک اطلاعاتی SQL Server آشنا باشید، فقط باید بدونید که هر کدام از نودها در شکل بالا، یک Page را تشکیل میدهند و اینکه از 1 تا 25 داخل یک Page قرار می گیرد، این به اندازه Page و حجم داده ها بستگی دارد.
3- بعد از تعریف ایندکس، SQL Server بصورت خودکار از ایندکس ها استفاده می کند و نیاز به انجام کاری از جانب شما نیست...! جالبه نه ...!
برای کسب اطلاعات بیشتر در مورد اینکه SQL Server برای اجرای یک کوئری از کدام اینکدس استفاده می کند به لیک زیر مراجعه فرمایید:
beyamooz.com/performance/388-session6/3448-statistics-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F
سلام
سوالی که پرسیده شد سوال من هم بود و جواب گرفتم ممنون
فقط یه سوال دیگه برام پیش اومده
این که گفتید برای ساخت ایندکس روی فیلد f1 ابتده داده های فیلد مرتب میشن،این کار بصورت خودکار توسط sql server انجام میشه؟
با سلام.
زمانی که فیلدی رو indexگذاری میکنید،دیتابی س به اون یه شماره میده که و هنگام واکشی بر اساس اون شماره عملیات صورت میگیره. که سرعت رو بالاتر میبره.