PDA

View Full Version : سوال: اندیس گزاری روی جداول



ealireza
دوشنبه 15 شهریور 1389, 05:46 صبح
دو جدول دارم که اطلاعاتی توش ذخیره میشوند
جدول اول بصورت عدد 16 بیتی هستند که روشون جستجو میشه
و جدول دوم یک جول با حدود 10 فیلد مختلف که هم متن و هم عدد داخلشون هست
ساختار دو جدول به شرح زیر هست

Table T1 {
int [Id] : identity primary key
int [ownerid]
int16 [itemid]
int16 [value]
}


توضیحات »
OwnerID کلید خارجی است از جدول Owner ...
ItemId و Value مقادیری هستند که جستجو روشون انجام میشه .

نمونه Query :

Select OwnerId from T1 where Ownerid in (1,2,3,4,5) and itemid=5 amd value=2
حدودا 200 هزارتا رکورد داریم که قراره روشون مثل بالا جستجو شه

اگه میشه منو راهنمایی کنید رو چه فیلد های اینکس رو تعریف کنم
و با چه میزان FILL


حالا از یه جدول خیلی بزرگ چند فیلد رو نیاز دارم که از کوئری بالایی بدست اومدن ..
جدول دوم خیلی بزگه و تعداد فیلد هاش بلا 20 فیلد هست ولی من اینها رو میخام مثلا

Select Field1,Field6,Field3,Field2 from T2 where id in (1,2,3,4,5)

در اینجا فیلد ها Nvarchar و Int هستند

خواهشا بهترین ایندکس که کمتر زمان کوئری و بار روی Sql رو داشته باشه برای این کوئری ها بهم معرفی کنید

ساختار جدول اول شبه کد است

باش تشکر فراوان از اساتید محترم

بهزادصادقی
دوشنبه 15 شهریور 1389, 23:44 عصر
با عرض معذرت، شما در بالا فقط ساختار یکی از جداول خود را آورده اید. می شود خواهش کنم ساختار دیگری و همچنین ساختار آن «حدول خیلی بزرگ» ای را که در موردش صحبت می کنید را بیاورید.

ealireza
سه شنبه 16 شهریور 1389, 14:21 عصر
جدول دوم ساختار خاصی نداره
فک کنید 20 تا فیلد که 10 تاش Int هست و یقیش varchar و Nvarchar ....

بهزادصادقی
چهارشنبه 17 شهریور 1389, 00:45 صبح
مرسی عزیز.

اگر من درست متوجه صورت مسئله شما شده باشم، این باید جواب بده.

برای T1:



create index IDX_T1_Covering_01 on T1( Ownerid, itemid, value );


برای T2، همه جیز بستگی دارد که به اینکه primary key آن جدول چه می باشد. اگر primary key جدول T2 ستون id آن جدول می باشد، آن وقت شما احتیاج به ایندکس دیگری ندارید. همان ایندکسی که SQL Server برای ایجاد و حفظ primary key جدول ساخته، کاملا query شما را پوشش خواهد داد. ولی اگر ستون id کلید اصلی جدول نیست، ایندکس زیر به شما کمک خواهد کرد:



create index IDX_T2_Covering_01 on T2( id ) include ( Field1, Field2, Field3, Field6 );


در حال حاضر، Fill Factor شما فرقی نمی کند.

ealireza
پنج شنبه 18 شهریور 1389, 19:38 عصر
بهزادصادقی عزیز
تشکر میکنم بابت جوابت
اما سوالی دارم اگه Field1, Field2, Field3, Field6 یک دهم از فیلد های اون جدول باشه

و ID کلید اصلی باشه
آیا تعریف

create index IDX_T2_Covering_01 on T2( id ) include ( Field1, Field2, Field3, Field6 );
فرقی به حال قضیه میکنه ؟
شنیده بودم ایندکس یه جدول کوچکتره .


مرسی

بهزادصادقی
پنج شنبه 18 شهریور 1389, 20:29 عصر
نه فرقی نمی کنه. حتی امکان زیادی دارد که عملکرد سیستم را در کل کمی هم کمتر کند. ولی متاسفانه توضیح اینکه چرا اینطور است مقدار زیادی وقت می برد.