[Lazarus] RE : SQLite performance problem. Simple query takes too long. (SOLVED)
Howard Lee Harkness
howard.lee.harkness at gmail.com
Fri Jul 29 22:11:09 CEST 2011
Ok, I found a fix, although I'm not really sure that I have fixed the
problem in the best way. What I did was to close all of the dependent
queries while doing the incremental search until the user selects a
client entry in the main dbgrid. Now the incremental search is as fast
as it was in PostgreSQL.
Although this dialog did not point directly to a solution, I learned a
lot, which eventually enabled me to find the bottleneck.
If any of you should think of a better way, please let me know.
Otherwise, I think it's good enough to deliver tomorrow. I spoke with
the customer and explained the slight difference in behavior, and he
thinks that is an improvement, because it will help prevent
accidentally entering phone #, address, etc. for the wrong client.
Thanks for the help!
On Fri, Jul 29, 2011 at 2:21 PM, Howard Lee Harkness
<howard.lee.harkness at gmail.com> wrote:
> On Fri, Jul 29, 2011 at 1:42 PM, Ludo Brands <ludo.brands at free.fr> wrote:
>> I traced through TSqlQuery.Close and there isn't happening a lot, except for
>> cleaning up prepared statements and cursors. And that is where your direct
>> BEGIN/COMMIT could very well confuse sqlite.
>> sqlite3_finalize(fstatement) is used to unprepare a statement. But is
>> fstatement still valid after you have restarted a transaction? I doubt it.
>> Do replace the ExecuteDirect with a TSqlQuery component. It is only a small
>> change and it removes a lot of causes of errors.
>
> Ok, it seems like a reasonable suggestion, so I tried that.
>
> The TSQLQuery object:
> object qDIU: TSQLQuery
> IndexName = 'DEFAULT_ORDER'
> AutoCalcFields = False
> Database = FormDatabase.SQLite3Connection
> Transaction = FormDatabase.SQLTransaction
> ReadOnly = False
> Params = <>
> left = 308
> top = 48
> end
>
> The updated procedure:
> procedure TfrmMain.ExecSQL(sql:string);
> begin
> // FormDatabase.SQLite3Connection.ExecuteDirect(sql);
> // FormDatabase.SQLite3Connection.ExecuteDirect('commit');
> // FormDatabase.SQLite3Connection.ExecuteDirect('begin transaction');
> qDIU.SQL.Text:=sql;
> qDIU.ExecSQL;
> FormDatabase.SQLTransaction.CommitRetaining;
> end;
>
> I also tracked down one other usage of ExecuteDirect in another form
> (not used for this test, but just in case) and applied the same
> change.
>
> The result: No improvement. If anything, things got slightly worse.
>
> However, I think maybe I have some insight into what is causing the
> problem. It looks like the lookups for the dependent tables are
> happening multiple times. Not sure why that would be (I didn't think I
> did anything to that part of the code other than change database
> engines), but I hope to find out shortly.
> --
> Howard Lee Harkness
> (214) 390-4896
>
--
Howard Lee Harkness
(214) 390-4896
More information about the Lazarus
mailing list