Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2011-07

RE : SQLite performance problem. Simple query takes too long. (SOLVED)

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Howard Lee Harkness

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!

Howard Lee Harkness wrote 49 lines
On Fri, Jul 29, 2011 at 1:42 PM, Ludo Brands 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

Reply by email