On Thu, 14 Apr 2016 13:44:45 +0200 R Smith <rsmith at rsweb.co.za> wrote:
> > > On 2016/04/14 10:46 AM, John Found wrote: > > Playing with optimization of my queries, I stuck on very strange (for me) > > behaviour of > > sqlite. > > > > The query is pretty complex, but for the experiment I simplified it to: > > > > select a, b from t order by a desc, b desc; > > > > The result of "explain query plan" is as expected: > > > > SCAN TABLE T > > USE TEMP B-TREE FOR ORDER BY > > > > Then I created index: > > > > create index i on T(a desc, b desc); > > > > After creating index, the explain query plan looks like: > > > > SCAN TABLE T USING COVERING INDEX i > > > > The query speed raises significantly and I leaved it this way. The original > > more complex query also started to use the index and increased its speed > > significantly. > > > > But after some time working in wild (executing the more complex original > > query), the performance decreased again and despite of existing the index, > > the result of the "explain query plan" is again: > > > > SCAN TABLE T > > USE TEMP B-TREE FOR ORDER BY > > > > After dropping the index and recreating, everything repeats from the > > beginning - short period of high performance queries and then not using > > index again. > > > > The database is not changed, at least for the tables used in the query. > > Only select statements are executed, by several connections. > > > > What can be the reason for such strange behaviour? > > > > Are you running periodic ANALYZE perhaps? > Yes, but from time to time, manually. How often should I run it? I mean there should be some reason for SQLite to ignore the existing index on not changed database. -- http://fresh.flatassembler.net http://asm32.info John Found <johnfound at asm32.info>

