نمایش نتایج 1 تا 21 از 21

نام تاپیک: سریعترین روش برای جستوجو

  1. #1
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    Lightbulb سریعترین روش برای جستوجو

    سلام خدمت تمام برنامه نویسان دلفی.
    بعد از مدت ها دوری،دلم براتون تنگ شده بود،اومد یه سری بهتون بزنم.

    اما یک سوال دارم،در حد حرفه ای ها.

    من یک Query به صورت ساده نوشته ام:(بانک اطلاعاتی ام SQLite و از کامپوننت های FireDac استفاده می کنم)

      FDQuery1.close;  FDQuery1.SQL.Text:='Select * from Customers where FirstName  LIKE "%'+Edit3.Text+'%"';
    FDQuery1.Open;


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

    در سایت stackoverflow.com آقای Mahmood_M برای Thread سوال گذاشته بودند و کاربران سایت جواب هایی داده بودند،درعمل این برای Query اصلا خوب نبود و پیغام های زیادی ظاهر میشد(از Argment , CPU گرفته تا انواع پیام های دیگر)،اما برای کار های دیگه مثل FTP عالللللییییییی بود.

    کسی نمونه پیغام ها رو خواست می تونم نشون بدم.
    اکرکسی راه حلی داره،ممنون می شوم راهنمایی کنه.

  2. #2
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    اینم لینک نرم افزار.
    اگر کسی خواست میتونه ببینه که چقدر کنده.
    البته این بانک اطلاعاتیش نسبت به اون بانک اصلی که گفتم،خیلی کمتره ولی توی این هم باز Query کند عمل می کنه.
    خود برنامه
    سورس برنامه
    آخرین ویرایش به وسیله ابوالفضل عباسی : شنبه 05 فروردین 1396 در 11:05 صبح

  3. #3

    نقل قول: سریعترین روش برای جستوجو

    سلام بر مهندس عزیز
    ببین این نمونه کد کارت رو راه میندازه.


    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls;

    type
    TForm1 = class(TForm)
    edtName: TEdit;
    lblResult: TLabel;
    Timer1: TTimer;
    procedure edtNameChange(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    private
    { Private declarations }
    StartChange : TDateTime;
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation
    uses DateUtils;

    {$R *.dfm}

    procedure TForm1.edtNameChange(Sender: TObject);
    begin
    StartChange := Now;
    if Timer1.Enabled = False then
    Timer1.Enabled := True;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    interval :integer;
    begin
    interval := MilliSecondsBetween(Now,StartChange);
    if interval > 300 then
    begin
    lblResult.Caption := edtName.Text;
    Timer1.Enabled := False;
    end;
    end;

    end.

  4. #4
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    دوست عزیز از اینکه پاسخ دادی ممنونم.
    ولی هیچ تغییری در روند سریعتر شدن احساس نشد.
    اگر برنامه رو در VCL بنویسی خیلی سریع جستوجو انجام میشود،اما در FMX قسمت ویندوز سریع نیست.
    من می خواهم یک روشی باشه که در FMX کوئری سریع عمل کند.

    ولی بازم ممنون

  5. #5
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

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

  6. #6

    نقل قول: سریعترین روش برای جستوجو

    مشکل از کوئری شما نیست کلا SQLIte دیتابیس خیلی‌ کندی هست؛ دلیل کندیش هم به این خاطر هست که مستقیم دیتا‌ها رو روی‌ هاردیسک ذخیره می‌کنه و میخونه یعنی سرعت خوندن و نوشتن کاملا به سرعت هاردیسک بستگی داره

  7. #7
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط negative60 مشاهده تاپیک
    مشکل از کوئری شما نیست کلا SQLIte دیتابیس خیلی‌ کندی هست؛ دلیل کندیش هم به این خاطر هست که مستقیم دیتا‌ها رو روی‌ هاردیسک ذخیره می‌کنه و میخونه یعنی سرعت خوندن و نوشتن کاملا به سرعت هاردیسک بستگی داره
    مگه بقیه پایگاه داده ها اطلاعات رو کجا ذخیره میکنن یا از کجا میخونن؟

  8. #8
    کاربر دائمی آواتار golbafan
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    در قلب دوستان
    پست
    2,018

    نقل قول: سریعترین روش برای جستوجو

    سلام
    معمولا 10 هزار رکورد چیز زیادی نیست حتی 100 هزار هم زیاد نیست
    شما باید ایندکس گذاریتون رو درست انجام بدید و برای کار مورد نظرتون باید بصورت fulltext ایندکس بزارید
    همچنین باید دیتابیس رو کامل fetch کنید بعد روش کوئری بزنید

  9. #9

    نقل قول: سریعترین روش برای جستوجو

    مگه بقیه پایگاه داده ها اطلاعات رو کجا ذخیره میکنن یا از کجا میخونن؟
    در نهایت اطلاعات روی هارد ذخیره می‌شه اما تو دیتابیس‌های غیر پرتابل با استفاده از رم و تکنیک مختلف و کش کردن سرعت افزایش پیدا می‌کنه

  10. #10
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط golbafan مشاهده تاپیک
    سلام
    معمولا 10 هزار رکورد چیز زیادی نیست حتی 100 هزار هم زیاد نیست
    شما باید ایندکس گذاریتون رو درست انجام بدید و برای کار مورد نظرتون باید بصورت fulltext ایندکس بزارید
    همچنین باید دیتابیس رو کامل fetch کنید بعد روش کوئری بزنید
    با ایندکس گذاری موافقم. اما واکشی کامل جدول و کوئری زدن روی اون رو خیلی موافق نیستم(نظر و تجربیات شما کاملا محترمه برای من). کل عملیات کوئری زدن بهتره که به عهده پایگاه داده باشه. برنامه صرفاً نقش نمایش اطلاعات رو داره. مگر در مواردی خاص

    توی این لینک چند تا دیتابیس Embeded مقایسه شده اند(البته در محیط دات نت) که نتایج SQLite مد نظر من هست

    واکشی 10.000 رکورد در حالت ایندکس گذاری شده 258 میلی ثانیه زمان میبره! یعنی کمتر از یک ثانیه! درحالیکه اگر ایندکس گذاری نشه، برای 2.000 رکورد حدود 3 ثانیه زمان میبره!(البته بطور کل از مابقی بانک ها خیلی جلوتره)

  11. #11
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط negative60 مشاهده تاپیک
    مشکل از کوئری شما نیست کلا SQLIte دیتابیس خیلی‌ کندی هست؛ دلیل کندیش هم به این خاطر هست که مستقیم دیتا‌ها رو روی‌ هاردیسک ذخیره می‌کنه و میخونه یعنی سرعت خوندن و نوشتن کاملا به سرعت هاردیسک بستگی داره
    یعنی چی؟
    مگه بقیه دیتابیس ها روی cache کار میکنن؟

  12. #12
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط golbafan مشاهده تاپیک
    سلام
    معمولا 10 هزار رکورد چیز زیادی نیست حتی 100 هزار هم زیاد نیست
    شما باید ایندکس گذاریتون رو درست انجام بدید و برای کار مورد نظرتون باید بصورت fulltext ایندکس بزارید
    همچنین باید دیتابیس رو کامل fetch کنید بعد روش کوئری بزنید
    من ایندکس ندارم.
    درضمن منظورتون از fetch چیست؟

  13. #13
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    با ایندکس گذاری موافقم. اما واکشی کامل جدول و کوئری زدن روی اون رو خیلی موافق نیستم(نظر و تجربیات شما کاملا محترمه برای من). کل عملیات کوئری زدن بهتره که به عهده پایگاه داده باشه. برنامه صرفاً نقش نمایش اطلاعات رو داره. مگر در مواردی خاص

    توی این لینک چند تا دیتابیس Embeded مقایسه شده اند(البته در محیط دات نت) که نتایج SQLite مد نظر من هست

    واکشی 10.000 رکورد در حالت ایندکس گذاری شده 258 میلی ثانیه زمان میبره! یعنی کمتر از یک ثانیه! درحالیکه اگر ایندکس گذاری نشه، برای 2.000 رکورد حدود 3 ثانیه زمان میبره!(البته بطور کل از مابقی بانک ها خیلی جلوتره)
    از پاسخ همه ی دوستان ممنونم
    بنظرتون چه جوری می تونم بهترین ایندکس گذاری رو انجام بدهم؟
    اگه میشه یک نمونه ایندکس گذاری پیشنهاد بدید.

  14. #14
    کاربر دائمی آواتار golbafan
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    در قلب دوستان
    پست
    2,018

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    اما واکشی کامل جدول و کوئری زدن روی اون رو خیلی موافق نیستم
    شما درست میگید
    من تصورم این بود که ایشون دارن چیزی شبیه دیکشنری رو پیاده میکنن و در این صورت دارن اطلاعات رو هردفعه در گرید تغییر میدن

  15. #15
    کاربر تازه وارد
    تاریخ عضویت
    شهریور 1391
    محل زندگی
    tabriz tehran
    پست
    80

    نقل قول: سریعترین روش برای جستوجو

    Sqlite خیلی سریعتر هست ولی بخاطر اینکه لوکال بودنش یک ضعف بسیار بزرگی محصوب میشه و الا خیلی خوبه این پایگاه لطفا لینک رو مطالعه بکنید.
    https://www.sqlite.org/speed.html

  16. #16
    کاربر دائمی آواتار golbafan
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    در قلب دوستان
    پست
    2,018

    نقل قول: سریعترین روش برای جستوجو

    در یک بنچمارک برخی دیتابیس های embedded مقایسه شدن
    زمان خواندن و نوشتن برای 100.000 رکورد بر حسب ثانیه
    p1404105100.86.png
    منبع
    http://charlesleifer.com/blog/comple...s-with-python/

  17. #17
    کاربر دائمی آواتار golbafan
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    در قلب دوستان
    پست
    2,018

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط ابوالفضل عباسی مشاهده تاپیک
    از پاسخ همه ی دوستان ممنونم
    بنظرتون چه جوری می تونم بهترین ایندکس گذاری رو انجام بدهم؟
    اگه میشه یک نمونه ایندکس گذاری پیشنهاد بدید.
    معمولا روی فیلدهایی که جستجو بیشتر انجام میشه بصورت تک تک ایندکس میزارن
    بیشتر به طراحی کار شما بستگی داره اما اگر فیلد متنی هست و قراره حرف به حرف جستجو کنید ایندکس های از نوع فول تکست باشن بهتره

  18. #18

    نقل قول: سریعترین روش برای جستوجو

    استفاده از Thread و یا VCL و FMX یا هر چیزی در لایه نرم افزار تاثیر زیادی روی سرعت جستجو نداره
    باید بانک اطلاعاتی رو بهینه کنید، ایندکس گذاری کنید، از " * " در Select ها استفاده نکنید
    وقتی از Like استفاده می کنید اگر سمت چپ مقدارتون " % " گذاشته باشید دیگه ایندکس کاربرد نداره و دوباره جدول کامل اسکن میشه
    باید روی دیتابیس و Query تمرکز کنید برای افزایش سرعت
    نکات دیگه ای هم هست مثل استفاده از DisableControls و EnableControls که می تونه تاثیر زیادی داشته باشه، که البته بستگی به نحوه ی انجام جستجو هم داره
    استفاده از Thread مفیده و باعث میشه برنامه هنگ نکنه و کاربر اذیت نشه اما اصول کار با ترد ها رو باید رعایت کنید، هر Thread باید یک Connection جداگانه داشته باشه و برخی موارد دیگه که اگه رعایت نکنید نتیجه عکس می گیرید
    برای اطلاعات بیشتر، در سایت مبحث Thread ها رو جستجو کنید

  19. #19

    نقل قول: سریعترین روش برای جستوجو

    مشکل دیگه کندی sqlite اینه که تمام عملیاتش غیر موازی و به صورت خطی‌ اجرا می‌شه زمانی‌ که درخواست خوندن یا نوشتن ارسال می‌کنید تا زمانی‌ که عملیات به پایان نرسه نمی‌شه درخواست دیگه‌ای رو ارسال کرد
    و یک نکته دیگه اینکه شما زمان درج یا خوندن کوئری‌هاتون رو نگفتید که بشه گفت طبیعی‌ هست یا نه


    نقل قول نوشته شده توسط ابوالفضل عباسی مشاهده تاپیک
    یعنی چی؟
    مگه بقیه دیتابیس ها روی cache کار میکنن؟
    کجای صحبت من گفت شده دیتابیس‌های دیگه روی کش کار می‌کنن؟
    کش کردن دیتا فقط یکی‌ از راهکارها هست که زمان کوئری‌های تکراری رو تقریبا به 0 می‌رسونه, مثلا موتور InnoDB در mysql از تکنیک buffer pool هم استفاده می‌کنه مقداری از فضای رم(اندازش رو می‌شه تغییر داد) رو برای کم کردن درخواست‌های I/O روی هارد در اختیار میگیره

  20. #20
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    نقل قول نوشته شده توسط Mahmood_M مشاهده تاپیک
    استفاده از Thread و یا VCL و FMX یا هر چیزی در لایه نرم افزار تاثیر زیادی روی سرعت جستجو نداره
    باید بانک اطلاعاتی رو بهینه کنید، ایندکس گذاری کنید، از " * " در Select ها استفاده نکنید
    وقتی از Like استفاده می کنید اگر سمت چپ مقدارتون " % " گذاشته باشید دیگه ایندکس کاربرد نداره و دوباره جدول کامل اسکن میشه
    باید روی دیتابیس و Query تمرکز کنید برای افزایش سرعت
    نکات دیگه ای هم هست مثل استفاده از DisableControls و EnableControls که می تونه تاثیر زیادی داشته باشه، که البته بستگی به نحوه ی انجام جستجو هم داره
    استفاده از Thread مفیده و باعث میشه برنامه هنگ نکنه و کاربر اذیت نشه اما اصول کار با ترد ها رو باید رعایت کنید، هر Thread باید یک Connection جداگانه داشته باشه و برخی موارد دیگه که اگه رعایت نکنید نتیجه عکس می گیرید
    برای اطلاعات بیشتر، در سایت مبحث Thread ها رو جستجو کنید
    ازهمه ی دوستان بخاطر راهنمایی شون ممنونم.
    از Thread و با رعایت قوانین ش هرکاری کردم باتوجه به صحبتتون نتیجه عکس میداد.و پیغام خطا های زیادی تولید میشد(حتی با extended هم کارساز نبود)

    درضمن اگر قرار باشه از فرمان Like استفاده نکنم،باید برای شبیه بودن کلمه جستوجو شده در بانک اطلاعاتی از چه چیزی استفاده کنم ؟

    حالا درسته که SQLite عملیاتاش خطی هست،اما با توجه به محیطی که برنامه نویسی میکنم و تنها بانکی روی اون محیط جواب میده SQLite هست،باید باهاش کنار بیام.
    اگر بشه کمی سرعت جستوجو هم بالابره خیلی خوب میشه.

  21. #21
    کاربر دائمی آواتار ابوالفضل عباسی
    تاریخ عضویت
    شهریور 1393
    محل زندگی
    Inside Esfahan
    پست
    719

    نقل قول: سریعترین روش برای جستوجو

    کسی نیست راهنمایی کنه؟
    واقعا گیرم

تاپیک های مشابه

  1. سریع ترین روش برای چاپ محتویات FlexGrid
    نوشته شده توسط shsoft در بخش برنامه نویسی در 6 VB
    پاسخ: 4
    آخرین پست: دوشنبه 11 اردیبهشت 1385, 21:54 عصر
  2. یک روش برای نوشتن قفل نرم افزاری
    نوشته شده توسط SalarSoft در بخش امنیت در شبکه
    پاسخ: 4
    آخرین پست: پنج شنبه 08 مرداد 1383, 09:29 صبح
  3. چند روش برای کد بهتر توصیه میکنم همه بخوانند!
    نوشته شده توسط SReza1 در بخش مقالات مرتبط با Delphi/Win32
    پاسخ: 1
    آخرین پست: جمعه 02 مرداد 1383, 10:31 صبح
  4. 8 روش برای جلوگیری از هک کردن در Asp.Net
    نوشته شده توسط SoheilKH در بخش ASP.NET Web Forms
    پاسخ: 0
    آخرین پست: سه شنبه 12 خرداد 1383, 13:26 عصر
  5. به نظر شما موثرترین روش برای یادگیری VB.Net چی میتونه باشه؟
    نوشته شده توسط S.Azish در بخش برنامه نویسی در 6 VB
    پاسخ: 8
    آخرین پست: شنبه 23 اسفند 1382, 08:09 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •