View Full Version : استفاده از index
FatemehB
سه شنبه 05 تیر 1386, 15:02 عصر
سلام
استفاده از index ها در SQL به چه طریق است ؟
آیا تعریف index به تنهایی کافی است یا دستور خاصی برای استفاده از ایندکس مورد نیاز می باشد؟
Kamyar.Kimiyabeigi
سه شنبه 05 تیر 1386, 15:04 عصر
تعریف ایندکس به تنهایی کافیست منتها باید بدونی بر روی چه فیلدی ایندکس بزنید چون اگر در تعریف ایندکس اشتباه کنید کمکی بهتون نمیکنه.
FatemehB
چهارشنبه 06 تیر 1386, 08:57 صبح
سلام و تشکر از جواب سریعتون
پس تنها شناسایی ایندکس ها کافیه و این کار SQL هست که تشخیص بده از کدوم ایندکس برای query استفاده کنه. درسته ؟
Kamyar.Kimiyabeigi
چهارشنبه 06 تیر 1386, 09:15 صبح
سلام و تشکر از جواب سریعتون
پس تنها شناسایی ایندکس ها کافیه و این کار SQL هست که تشخیص بده از کدوم ایندکس برای query استفاده کنه. درسته ؟
شما اگر Index درست انتخاب کنید کافیه منظورم اینه که شما نباید چندتا ایندکس انتخاب کنید به این امید که SQL خودش بهترین رو انتخاب کنه.
بعنوان مثال یکی از راه های انتخاب ایندکس اینه که شما میتونین بر روی فیلدهایی که در Where Condition تون میاد ایندکس بزنید که ایندکس مناسبی هست.
نکته : تعیین ایندکس ها باید زمانی انجام بشه که کار طراحی دیتابیس تمام شده و شما میخواین Query ها رو بسازین.
FatemehB
چهارشنبه 06 تیر 1386, 09:23 صبح
شما اگر Index درست انتخاب کنید کافیه منظورم اینه که شما نباید چندتا ایندکس انتخاب کنید به این امید که SQL خودش بهترین رو انتخاب کنه.
خب بهر حال Query های مختلفی روی یک جدول هست
می خوام بدونم اگر چندین ایندکس تعریف کنم ، SQL براساس شرط موجود در Query اقدام به انتخاب ایندکس می کنه ؟
یا اینکه اصلا چنین کاری اشتباه هست ؟
Kamyar.Kimiyabeigi
چهارشنبه 06 تیر 1386, 09:38 صبح
می خوام بدونم اگر چندین ایندکس تعریف کنم ، SQL براساس شرط موجود در Query اقدام به انتخاب ایندکس می کنه ؟
بله.
اینم یک متن عالی از جناب آقای ثباتی عزیز
اگر برای جدولتون Primary Key درست کردین، در حقیقت یک ایندکس Clustered ایجاد کردین که قسمت اول کار انجام شده. از آنجایی که هر جدول فقط یک Primary Key (PK) میتونه داشته باشه، تمام ایندکسهایی که از حالا به بعد میسازید باید NonClustered باشه که طی چند سطر بعد توضیحش رو عرض خواهم کرد.
مهمترین قسمت کار، تجزیه و تحلیل این هستش که برای کدام فیلدها ایندکس بسازیم. چون اولا ایندکسها فضا مصرف میکنند و ثانیا به مجرد هر عمل ویرایش اطلاعات، باید Update بشن. در نتیجه سعی میکنیم این فیلدها رو با احتیاط انتخاب کنیم تا ایندکسهای اضافی روی Performance بانک اطلاعاتی ما تاثیر منفی نداشته باشن.
بهتریم ملاک برای تشخیص اینکه کدام فیلدها ایندکس داشته باشن، دقیقا به Queryهای ما برمیگرده. یعنی ساخت ایندکسها جزء آخرین مرحله طراحی Database هستش. باید تمام Queryهایی که نیاز داریم برای انواع گزارش گیری ها مشخص بشن، بعد از اون فیلدهای کاندید شده رو بدست میاریم.
به عنوان یک معیار خوب، فیلدهایی که بعد از Where قرار میگیرن، کاندید ایدنکس خوردن میشن. مثلا اگر یکی از Queryهای ما به این شکل باشه:
SELECT * FROM customers WHERE country=Germany
میتوانیم نتیجه بگیریم که عمل جستجو روی فیلد country اتفاق خواهد افتاد، پس یک ایندکس روی این فیلد نیاز داریم:
WITH FILLFACTOR=80 CREATE NONCLUSTERED INDEX MyIndex1 ON customers(country)
پارامتر FILLFACTOR مشخص میکند که Pageهای ایندکس ما تا چند درصد پر شوند. برای جدولهایی که زیاد modify میشوند، مقدار 75 تا 80 مناسب هستش.
طبق قائده ای که ذکر شد میتوانیم فیلدهایی که نیاز به ایندکس دارند رو تشخیص بدیم. اگر فیلدهایی که در دستور SELECT ظاهر میشوند کم باشه و اون Query بارها و بارها استفاده میشه، ارزش این رو خواهد داشت که یک ایندکس ترکیبی (ترکیب شده از چند فیلد) بسازیم. به عنوان مثال این Query:
SELECT country, city, customerid FROM customers where country=germany
اگر به تعداد دفعات زیادی اجرا خواهد شد، برایش به جای ایندکس ذکر شده، این ایندکس رو خواهیم ساخت:
CREATE NONCLUSTERED INDEX MyIndex1 ON
customers(country,city,customerid) WITH FILLFACTOR=80
این نوع ایندکس رو اصطلاحا Covering Index مینامند چون تمام فیلدهای مورد نیاز Query، در ایندکس لحاظ شده. یعنی SQL Server برای اجرای Query نیازی به رجوع کردن به جدول نخواهد داشت و تمام اطلاعات مورد نیاز از طریق ایندکس تامین میشود. ولی اگر Query ما به این شکل باشه:
SELECT country, city, customerid, phone FROM customers WHERE country=germany
ایندکس ساخته شده، Covering نخواهد بود چرا که SQL Server برای بدست آوردن phone، میبایستی از قسمت ایندکس، به خود جدول اصلی رجوع کنه که در اصطلاح، Bookmark Lookup اتفاق می افتد و طبیعتا کمی افت سرعت خواهد داشت.
البته فراموش نکنید که هر چه تعداد فیلد ذکر شده در دستور ساخت ایندکس بیشتر باشد، حجم ایندکس ما بیشتر خواهد بود و همچنین دفعات بیشتری این ایندکس به update شدن نیاز پیدا خواهد کرد. به همین دلیل عرض کردم که اگر Queryما خیلی استفاده میشود، برایش Covering Index میسازیم. چون ارزش اون رو خواهد داشت. امیدوارم این اطلاعات که در حقیقت الفبای ساخت ایندکس هم شاید نباشه بتونه کمک کوچکی بکنه. اگر قسمتی نیاز به توضیح بیشتر داشت بفرمایید.
امیدوارم مشکلتون حل شده باشه.
FatemehB
چهارشنبه 06 تیر 1386, 09:48 صبح
از کمکتون سپاسگذارم
خیلی لطف کردید
**pooneh**
دوشنبه 18 تیر 1386, 13:01 عصر
سلام
معنی و مفهوم ایندکس چیه؟چه موقع ازش باید استفاده کرد؟از کجا باید فهمید که از ایندکس استفاده میشه کرد.
اگر ممکنه در غالب یک مثال برام توضیح بدید.ممنون.
Kamyar.Kimiyabeigi
دوشنبه 18 تیر 1386, 14:17 عصر
دوست عزیز در خصوص Index در این سایت زیاد صحبت شده همینطور در همین Topic. (اگر جستجو کنین زودتر به جواب میرسین)
اما در کل دو نوع ایندکس داریم
Clustered Index
Nonclustered Index
که اولی باعث میشه اطلاعات بر اساس اون فیلدی که Clustered Index داره به صورت فیزیکی مرتب شده و ذخیره شود (مثال : کلید اصلی جدول)
و دومی طریقه آدرس دهی بین Page های SQL Server را بهینه میکنه که با صرف کمترین هزینه زمانی به اطلاعات دسترسی پیدا کنین. (البته ایندکس گذاری واقعا" یک معقوله مفصلیه که با یکی دو تا جمله نمیشه توضیح داد)
در خصوص مثال هم به پست شماره 6# مراجعه کنین.
FatemehB
دوشنبه 18 تیر 1386, 14:22 عصر
ایندکس برای بالا بردن سرعت در جستجوها هست.
در واقع با ساختن ایندکس مثلا بر روی یک فیلد می تونیم سرعت دسترسی به رکوردهای مشابه در اون فیلد خاص رو بالا ببریم. البته این کار باعث اندکی افزونگی در اطلاعات میشه ولی ارزششو داره
اگه به این سایتها سر بزنید ضرر نمی کنید
http://www.sql-server-performance.com/rd_index_fragmentation.asp
http://www.sql-server-performance.com/gv_index_data_structures.asp
موفق باشید
AminSobati
دوشنبه 18 تیر 1386, 22:19 عصر
در یک جمله: ایندکس باعث میشه جستجوی شما در دامنه بسیار کوچکتری از اطلاعات انجام بشه با این تضمین که جواب جستجوی شما در همون محدوده قرار داره!
**pooneh**
سه شنبه 19 تیر 1386, 09:19 صبح
سلام،
متن بالا را خوب مطالعه کردم،ضمنا به کتاب آموزش sql در 21 روز نگاهی انداختم،ولی یک سری سوال واسم پیش اومد که مفهو مشون رو نمیدونم:
مفهوم صفحه چیه؟؟؟؟؟؟؟
داده ها در صفحات داده ای ذخیره میشوند؟؟؟؟؟؟؟؟؟؟؟
برای یافتن یک سطر خاص b-tree پیمایش میشود،این کار از صفحه ریشه آغاز میشود؟؟؟؟؟؟؟؟؟؟
صفحه ریشه شامل ورودیهای ایندکس است؟؟؟؟؟؟؟؟؟
ممنون میشم جواب بدید.
AminSobati
سه شنبه 19 تیر 1386, 22:12 عصر
دوست عزیزم،
هر Page هشت کیلو بایت ظرفیت داره و اطلاعات جداول و ایندکسها داخل این Pageها قرار میگیره. زمانی که ایندکس non clustered میسازید، اطلاعات فیلدهای شرکت کننده در ایندکس، ابتدا Sort میشن و بعد در Pageها چیده میشن. اگر فرضا جدول شما 10000 رکورد (در بیست Page) داشته باشه و یک فیلد رو ایندکس non clustered بزنین، ممکنه سه Page برای این ایندکس اشغال بشه. حالا اولین رکورد در هر Page، به Page بالاتر هم کپی میشه. پس در Page بالایی سه رکورد ثبت میشه. این Page میشه Root یا ورودی ایندکس. اگر این ایندکس قرار باشه به Query خاصی کمک کنه، جستجو از Root آغاز میشه. علت اینکه ایندکس رو بهش B-Tree یا Balanced Tree میگن اینه که شکل ایندکس مثل یک درخته معکوسه، یعنی ریشه این درخت در بالا قرار داره و شاخ و برگش در پایین. در مثال ما، این درخت یک Page در بالا، سه Page پایین، و بیست Page هم پایینتر (خود جدول) داره.
این توضیحات بدون شکل قدرت ارائه مفهوم رو نداره. در اینترنت اگر جستجو کنین توضیحات با شکل مفصلا پیدا میشه
**pooneh**
سه شنبه 19 تیر 1386, 23:03 عصر
آقای ثباتی ممنون از توضیحات خوبتون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.