PDA

View Full Version : مشکل performance در SQL CE



aryasoft2872
دوشنبه 10 بهمن 1390, 00:04 صبح
با سلام
مدتی قبل برنامه ای نوشتم برای ویندوز فون که پایگاهی با حدود 50000 لغت داره و برای جستجو کردن لغت از LINQ استفاده می کنم.ولی برنامه هنگام سرچ کردن سرعتش فوق العاده پایین میاد.خواستم ببینم اگر راهی داره ممنون میشم راهنمایی کنید.در زیر یکخورده ای درباره شیوه جستجو می گم تا شاید جایی از کارم مشکل داشته باشه.

دو تا لیست تحت عنوان ALLWords و QuryedWords تعریف می کنم و توی رویداد تغییر متن تکست باکس بررسی می کنم که اگر متن تکست باکس برابر باشه با متن قبلی تکست باکس + 1 حرف از داخل QuryedWords جستجو کن و نتایج رو بریز توی QuryedWords و سورس لیست نتایج رو بزار QuryedWords ولی اگر شرط برقرار نبود QuryedWords رو برابر بزار با AllWords و حالا جستجو رو مثل قبل انجام بده.

البته یک جستجویی کردم در مورد اندیس ها ولی ظاهرا اندیس ها برای دیکشنری کاربردی ندارن به دلیل زیر:
However, it is not useful for this query:


... WHERE "First Name" = 'John'

When you create a multiple-column index, you should put the most selective columns leftmost in the key. This makes the index more selective when matching several expressions.


در ضمن برای جستجو همونطور که توی عنوان تاپیک گفتم از SQL Compact Edition استفاده کردم ولی انگار بخشی برای نسخه Compact وجود نداره همینجا سوالم رو پرسیدم

یوسف زالی
دوشنبه 10 بهمن 1390, 22:12 عصر
سلام.
به نظرم روی OnExit کار می کردید مجبور به این کار نمی شدید که RealTime کوئری بگیرید.
اگر لایک نمی کنید بهتره که هنگام ورود داده جدول رو سرت می کردید. روی جدول سورت جستجو خیلی راحت تره.
به هر حال:
اگر کلاینتتون فقط همون فونه و تک کاربره هست این روش رو امتحان کنید:
فیلدی رو (QR) از نوع عدد به جدول اضافه کنید که مقدار اولیه صفر داره.
تعداد طول رشته رو هم به کوئری پاس بدید. (Ln)
در هر بار کال شدن کوئری مسیر زیر رو طی کنید:

update Dict set QR = Ln where QR >= Ln-1 and YourSearchCondition
select * from Dict where QR = Ln

این طوری انتقال هاتون حدف می شه.
مثلا برای سرچ کلمه word:
w -> تمام جدول با شروع حرف w دارای QR با مقدار 1 می شه.
o -> تمام جدول با مقدار QR >= 1 و حرف دوم o دارای QR = 2 می شه.
r -> تمام جدول با مقدار QR >= 2 و حرف سوم r دارای QR = 3 می شه.
..
حالا در همین جا اگر r رو پاک کنیم:
تمام جدول با QR >=1 که شرط ما رو دارن 2 می شن. یعنی حاصل جستجوی r برمی گرده.

فکر کنم واضح باشه بقیش.
موفق باشید.

aryasoft2872
سه شنبه 11 بهمن 1390, 18:51 عصر
خیلی ممنون بابت پاسختون ولی مشکل اینجاست که فایل sdf به صورت کانتنت قرار گرفته و توی Windows phone اگر بخواید فایل رو ویرایش کنید باید توی IsolatedStorage باشه که این سرعت رو فوق العاده پایین میاره از طرفی اگر بخوام با SQL Editor فیلد های QR رو پر کنم راهی که به ذهنم میرسه اینه که یک SQL Command Maker بسازم که برای همه ی 50000 لغت هر کدومشون یک فرمان SQL بنویسه که QR رو برابر با Length بزاره که خوب اینم مقداری وقت گیره اگر راه سریع تر و کم دردسر تری پیشنهاد دارید خیلی خوب میشه

در ضمن توی WP کلا Query اس کیو ال قابل استفاده نیست و از LINQ فقط باید استفاده بشه کد جستجوی من هم دقیقا همینه:
var MyQuery = from words Pharse in QueWords where Pharse.English.StartsWith(textBox1.Text) select Pharse;
حالا با این شیوه جستجو باز هم امیدی هست که با این کاری که گفتید سرعت بالا بره(جدولم از ابتدا خودش سورت بوده،ولی باز هم سرعت پایینه)

با تشکر فراوان

یوسف زالی
سه شنبه 11 بهمن 1390, 21:01 عصر
این چیزها دیگه می ره تو حیطه #C.
اصولا هر کوئری رو می شه با لینک در آورد.
اگر جدولتون سورت هست جستجوی باینری خیلی سریع شما رو یه جواب می رسونه.
مثلا یک ایندکس بسازید که کلاستر باشه (دستی بسازید نه واقعا شی در اس کیو ال باشه) مثلا جدولی موازی بسازید که در اون ID های جدول اصلی به ازای هر کاراکتر وجود داشته باشند.
مثلا این طور:

Character ID
-----------------
1 a
139 b
400 c
987 d

این یعنی اگر حرف اول شما b باشه می دونید که بازه 139 تا 399 مد نظر شماست.
می تونید مثلا برای ترکیب دو کاراکتر جدول بسازید.
معمولا تا همین سطح افزایش سرعت به شدت محسوس خواهد شد.
امیدوارم تونسته باشم کمک کرده باشم.
موفق باشید.