PDA

View Full Version : عملگر LIKE بر روی حدود 30 میلیون رکورد



Hybrid
شنبه 07 فروردین 1395, 16:16 عصر
سلام دوستان ، یک سوال دیگه در ادامه سوالم هام داشتم ...
بنده در سوال قبلی گفتم که یک جدول دارم که حدود 20 تا 30 میلیون رکورد داره ( اسم ستون هاش هم مهم نیست شما فرض کنید ID ، Name ، InsertDate ) . حالا می خوام که با استفاده از عملگر LIKE یک جستجو بر روی این جدول انجام بدم .
بع عنوان مثال :

SELECT name FROM tableNames
WHERE name LIKE 'sia%'
ولی متاسفانه خیلی طول میکشه که نتیجه ی اجرای کوئری نمایش داده بشه ، در حدود 16 ثانیه !
این فیلد هم ایندکس داره .

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

silverfox
شنبه 07 فروردین 1395, 19:04 عصر
از full text search استفاده کن performance بهتری می تونی داشته باشی چون like اصلا از index استفاده نمی کنه ولی توی FTS می تونی FullText index (https://msdn.microsoft.com/en-us/library/ms187317.aspx?f=255&MSPPError=-2147217396) تعریف کنی.

Hybrid
یک شنبه 08 فروردین 1395, 05:00 صبح
مرسی از پاسخ شما دوست عزیز ، متاسفانه از SQL Server CE استفاده می کنم و همانطور که می دونید از Full Text Search پشتیبانی نمی کنه . بنا به دلایلی دارم از این پایگاه داده استفاده می کنم و نمیشه به نسخه اصلی ببرم .

silverfox
یک شنبه 08 فروردین 1395, 05:37 صبح
خب پس سناریو ای که داری رو بیشتر توضیح بده شاید بشه با تغییر معماری برنامه سرعت رو بهبود بخشید.

Hybrid
یک شنبه 08 فروردین 1395, 05:51 صبح
سلام ، ببینید دارم روی یک برنامه برای windows کار میکنم که در این برنامه اطلاعات فایل های مختلف هارد رو در پایگاه داده برنامه ذخیره میکنه ( بعدا یک سری عملیات میام روی این فایل ها انجام میدم ) .
اون جدولی هم که اطلاعات این فایل ها در اون قرار میگیره ممکنه تعداد رکورد هاش به بیش از 30 میلیون برسه . ساختار جدولش هم به شکلی هست که در پست اول گفتم ( 3 ستون داره ID و FileName ، InsertDate ) . حالا به عنوان مثال می خوام فایل هایی رو پیدا کنم که مثلا نام book در اون ها باشه . ولی همانطور که گفتم سرعت اجرای کوئری بسیار پایین هست و بنده نمی خوام کاربر اینقدر منتظر باشه .
نوع پایگاه داده رو نمی تونم تغییر بدم . در سرعت نمایش اطلاعات خیلی خوب عمل میکنه و اطلاعات رو با سرعت خیلی خوبی در DGV نمایش می ده ولی متاسفانه در عمل جستجو بسیار کند هستش .

parsdarab
یک شنبه 08 فروردین 1395, 08:50 صبح
سلام

ایندکسی که ایجاد کردی چگونه ایجاد شده است؟ (این خیلی مهمه)

شما دو راه دارید

بستگی به دستور select داره.

اگه دستوری که داخل برنامه اجرا میشه به صورت زیر باشه

select Fname from personel where Fname like '%B%'

ایندکسی که ایجاد میشه باید به صورت زیر باشه

create nonclustered index IX_Fname on personel(Fname)

ولی اگه دستور به صورت زیر باشه

select Fname,Lname,age from personel where Fname like '%B%'
ایندکس به صورت زیره

create nonclustered index IX_FnameAlpha on personel(Fname) include(Lname,age)

فرق در تعداد فیلدهایی که انتخاب میشه.
این هم پلن اجراییش اگه از ایندکس مناسب استفاده نشه جستجو زمانبر میشه

139737

silverfox
یک شنبه 08 فروردین 1395, 12:21 عصر
index کمکی نمی کنه فقط در حالتی که %abc داشته باشیم می تونه index طوری رکورد ها رو دسته بندی کنه که performance بهتر بشه وقتی مثلا %abc% داریم توی مثال خود شما، چطور index می خواد رکورد ها رو توی چه ساختمان داده ای قرار بده که بتونه بهینه جستجو کنه؟

برای حالت %abc می شه اینطوری عمل کرد‌:



Value
ID


aaaaaa
1


aaaaab
2


ab213w
3


abcdefg
4


abcmnop
5


abefghm
6


acefgmn
7




ولی برای حالت %B% نمی شه از index استفاده کرد.

توی linux یه پکیج هست به اسم mlocate (https://fedorahosted.org/mlocate/browser/README) که کاری مشابه کار شما رو انجام می ده یعنی با دستور updatedb میاد لیست فایل ها رو آپدیت می کنه در دیتابیس خودش و با دستور locate ... میاد فایل هایی که توی اسمشون عبارت خاصی وجود داشته باشه رو پیدا می کنه، اگه در مورد نحوه پیاده سازی اون جستجو کنی شاید به جوابی که می خوای برسی.