PDA

View Full Version : بهبود کارایی و سرعت در پیاده سازی جستجو بر اساس Tag



mirza
جمعه 29 بهمن 1389, 00:51 صبح
سلام
یه جدول دارم با 100 هزار رکورد (مثلا محصول)
هر رکورد این جدول دارای 80 تگ هست که در جدول دوم ذخیره میشه وبا کلید خارجی به جدول اول ربط داده میشه-جدول دوم تقریبا 8 میلیون رکورد داره
هدف جستجو بر اساس تگ ها هس-مثلا محصولاتی که دارای چند تا تگ هستن
من جداول رو join میکنم و مثلا برای پیدا کردن محصولاتی که 3 تا تگ توشون بکار رفته -یک کوری با 3 تا selectتو در تو بکار میبرم- مشکلم سرعت هست-هر چی تگ ها زیاد تر میشن سرعت کمتر میشه-مثلا برای جستجوی محصولاتی با سه تگ 6 ثانیه زمان میخواد
آیا این شیوه پیاده سازی برای تگ ها درسته؟
روش بهتری برای جستجو که سرعتو ببره بالا و جود داره؟
ممنون از دوستان

حمیدرضاصادقیان
جمعه 29 بهمن 1389, 09:32 صبح
سلام.
ساختار جدولتون اینطور که توضیح دادید مشکلی نداره. ولی کوئری شما ایراد داره.
بهتره شما ساختار دو جدول و نمونه ای از اطلاعات داخلش و کوئری هم که برای بدست آوردن اطلاعات می نویسید رو اینجا قرار بدید تا بهتر بشه راهنمایی تون کرد.

mirza
جمعه 29 بهمن 1389, 14:41 عصر
1- جدول اطلاعات عکس Image_Info
Number bigint و imagename nvarchar

2-جدول اطلاعات تگ های هر عکس img_tag
imageid bigint و tagid bigint
برای جستجو در عکسهای با یک تگ :



SELECT dbo.Image_Info.Number, dbo.img_tag.tagid
FROM dbo.Image_Info INNER JOIN
dbo.img_tag ON dbo.Image_Info.Number = dbo.img_tag.imageid
WHERE (dbo.img_tag.tagid = 110)




برای جستجو در عکسهای با دو تگ :




SELECT dbo.Image_Info.Number, dbo.img_tag.tagid
FROM dbo.Image_Info INNER JOIN
dbo.img_tag ON dbo.Image_Info.Number = dbo.img_tag.imageid
WHERE (dbo.img_tag.tagid = 110) AND (dbo.Image_Info.Number IN
(SELECT Image_Info_1.Number
FROM dbo.img_tag AS img_tag_1 INNER JOIN
dbo.Image_Info AS Image_Info_1 ON img_tag_1.imageid = Image_Info_1.Number
WHERE (img_tag_1.tagid = 660)))



برای جستجو در عکسهای با سه تگ :




SELECT dbo.Image_Info.Number, dbo.img_tag.tagid
FROM dbo.Image_Info INNER JOIN
dbo.img_tag ON dbo.Image_Info.Number = dbo.img_tag.imageid
WHERE (dbo.img_tag.tagid = 110) AND (dbo.Image_Info.Number IN
(SELECT Image_Info_1.Number
FROM dbo.img_tag AS img_tag_1 INNER JOIN
dbo.Image_Info AS Image_Info_1 ON img_tag_1.imageid = Image_Info_1.Number
WHERE (img_tag_1.tagid = 660) AND (dbo.Image_Info.Number IN
(SELECT Image_Info_1.Number
FROM dbo.img_tag AS img_tag_1 INNER JOIN
dbo.Image_Info AS Image_Info_1 ON img_tag_1.imageid = Image_Info_1.Number
WHERE (img_tag_1.tagid = 670)))))




که باselect های تو در تو پیاده سازی میکنم

آیا از این روش بهینه تری هم وجود داره؟
برای پیدا کردن عکسی با 5 تگ 6 ثانیه زمان صرف میشه
آیا میشه روی فیلد img_tag ایندکس تعریف کنم
آیا تاثیری تو سرعت داره؟
اگه ایندکس تعریف کنم آیا تغییری تو نحوه دستوراتم باید بدم؟
ممنون از توجه و راهنماییتون