PDA

View Full Version : index های چند گانه



AmirAlimadadi
یک شنبه 17 آذر 1387, 14:12 عصر
سلام به همه دوستان
من می خوام بدونم که آیا توی sql server می شه روی یه جدول چند index تعریف کرد(البته مسلم هست که Nonclustered). و اگه می شه چه جوری باید از اونا استفاده کرد، یعنی توی هر query جدول رو بر اساس ایندکس دلخواه مرتب کرد(مثلا برای query1 جدول بر اساس ایندکس 1 و برای query2 جدول بر اساس ایندکس 2 مرتب بشه). مثل اون چیزی که در fox pro هست.
اگه کمک کنین ممون می شم

Alireza Orumand
یک شنبه 17 آذر 1387, 15:06 عصر
سلام
بحثی که شما میفرمایید دو مقوله جداست.مرتب سازی یا index ولی در کل موارد زیر از سوال شما برداشت میشه که من توضیح میدم.
اگه مرتب سازی مد نظر شما هست که order by برای هر کوئری به طور جدا میشه گذاشت و این از واضحات و مسلمات محسوب میشه.
اگه منظورتون اینه دقیقا تعریف indexهست. باز هم میشه این کار رو انجام داد و خود SQLServer از هر کدوم از ایندکس ها که خودش صلاح بدونه استفاده میکنه.
اگه میخواید یه query از یه index دلخواه شما حتما استفاده کنه که از دستور use استفاده کنید.
اگه هم منظورتون order by پیش فرض هست باید بگم خیر. نمیشه. به طور پیش فرض با clustered index مرتب میشه.
اگه هم جواب شما در موارد بالا نبود دقیق تر توضیح بفرمایید تا عرض کنم خدمت شما. D:
موفق باشید.

AmirAlimadadi
یک شنبه 17 آذر 1387, 15:21 عصر
سلام و ممنون از توضیحاتتون دوست عزیز
فکر می کنم که جواب من همون use باشه، اما من نمی دونم چه طور باید از اون استفاده کرد، می شه بیشتر توضیح بدین.

اگه توضیح بیشتری خواسته باشین، باید بگم من یه پایگاه داده بزرگ دارم که می خوام چند تا پرس و جوی مختلف رو روی اون اجرا کنم، برای اجرای سریعتر این پرس و جوها می خوام که ایندکس روی جدول داشته باشم. حالا می خوام که چند تا ایندکس باشه و در یه query خاص از یه ایندکس خاص استفاده کنم (اینم باید بگم که چون پرس و جوهام متنوع هستند باید چند ایندکس داشته باشم).
یه سوال دیگه ای هم که دارم اینه که ایندکس رو تا چه حدی می شه گسترش داد، مثلا می خوام بدونم که ایندکس ها فقط سطرها رو مرتب می کنن و یا کارای دیگه ای هم انجام می دن(مثلا این که سطرهایی که یه فیلد خاص (مثلا stdnum) اونا خالی هست رو توی جواب نیاره . یا اینکه سطرهایی که فیلد تاریخ اونا از یه مقدار خاص از پیش تعیین شده کمتر هست رو توی جواب نیاره)

mehdi.mousavi
یک شنبه 17 آذر 1387, 16:35 عصر
سلام و ممنون از توضیحاتتون دوست عزیز فکر می کنم که جواب من همون use باشه، اما من نمی دونم چه طور باید از اون استفاده کرد، می شه بیشتر توضیح بدین.

سلام.
برای اینکه SQL Server رو مجبور کنید تا از Index مورد نظر شما استفاده کنه، باید بدین صورت عمل کنید:



SELECT i.indid, i.name FROM sysindexes i INNER JOIN sysobjects o ON o.ID = i.id WHERE o.Name = 'myTable'
SELECT * FROM mytable WITH (INDEX = the_id_we_have_already_obtained) WHERE myColumn = 'myValue'

لطفا بخاطر داشته باشید که انتخاب نادرست Index، تاثیر بسیار بدی در Performance خواهد داشت.

AminSobati
یک شنبه 17 آذر 1387, 23:25 عصر
دوست عزیزم،
SQL Server رو مجبور به استفاده از ایندکس خاص نکنید مگر زمانی که درک عمیقی از الگوریتمهای بهینه سازی Query داشته باشید و یقین کنید که Query Processor ایندکس اشتباه رو انتخاب کرده. در 99 درصد موارد Query Processor کارش رو بدون کوچکترین عیبی انجام میده.
تشخیص اینکه چه ایندکسی بسازید تا SQL Server ازش استفاده کنه خودش مقوله مفصلی هست و بحث Tuning نیاز داره. اصل سوال که در پست شماره 1 مطرح شد، نشون میده دوستمون دیدگاه Foxی دارن! در Fox شما باید یک ایندکس رو Open و Use کنید چون Query Processor به مفهومی که در SQL Server هست وجود نداره. در SQL Server شما ایندکسی که میسازید، چنانچه به حال Query مفید باشه بصورت اتوماتیک استفاده خواهد شد و اگر این ایندکس با تحلیل غلط بدست اومده باشه و کمکی به Query نکنه، فقط یک Object زاید خواهد بود که فضای دیتابیس شما رو اشغال کرده و در ویرایشها سربار ایجاد میکنه.
این لینکها برای شناخت بهتر ایندکس میتونه مفید باشه:
http://www.barnamenevis.org/forum/showthread.php?t=9498
http://www.barnamenevis.org/forum/showthread.php?t=37664

AmirAlimadadi
دوشنبه 18 آذر 1387, 07:45 صبح
ممنون از محبتتون، فکر می کنم مشکل حل شد. اگه اون قدری که می گین query processor قوی هست که دیگه تقریبا کار من خیلی راحت می شه.