ANALYZE analyzes the data distribution of the indexes. This is affected by the data distribution of the tables, since the indexes index the tables. The statistics computed by the analysis are stored in the database and used to choose the most efficient way to execute a query.
If your data never changes, then you never need to run analyze but the one time. If the statistical result never changes, then you only need to run analyze one time. However, if it is possible that the data distribution could change, then you need to run analyze sto that the statistical result "matches" the actual database. For example if you have a table with 4 records in it and run analyze, this will be recorded. If you later insert 14 billion records in that table, then when you perform a query the optimizer will ACT AS IF the table only had four records. This may or may not result in a non-optimal query plan and non-optimal performance. Only you, the designer of the database, will know the answer to that question. The solution however is simple: run analyze so that the statistical data matches the current content of the database. --- () ascii ribbon campaign against html e-mail /\ www.asciiribbon.org > -----Original Message----- > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users- > boun...@sqlite.org] On Behalf Of Paolo Bolzoni > Sent: Saturday, 11 May, 2013 09:17 > To: General Discussion of SQLite Database > Subject: Re: [sqlite] Scan table in explain query. Question. > > At the moment EXPLAIN gives me a very small number of rows > for all the queries (thanks to indexes) a part of this one, so if I > understand correctly ANALYZE is not needed anymore. > > Or I can get a speed up executing once in a while? > > Regards, > Paolo > > > On Sat, May 11, 2013 at 1:06 PM, Clemens Ladisch <clem...@ladisch.de> > wrote: > > Paolo Bolzoni wrote: > >> sqlite> explain query plan SELECT id FROM tour LIMIT 1; > >> 0|0|0|SCAN TABLE tour USING COVERING INDEX tour_unsorted_path_idx > >> (~1000000 rows) > >> > >> I am not still sure I understand completely the output of explain > >> query plan. > > > > It means that SQLite estimates that the table (or its index) contains > > about 1000000 rows. > > > > The LIMIT clause is *not* used for this estimate. > > > >> To get this simple result, sqlite3 actually scans the whole > >> table? > > > > No. Without the LIMIT, the query would scan the entire index. With the > > LIMIT, the scan is stopped after the first row. > > > >> I just have a question about query written in the begin, in my > >> application I use it to know if a table is empty. I execute it > >> and just use sqlite3_step return value. Errors a part, if it is > >> SQLITE_DONE the table is empty, if it is SQLITE_ROW it is not. > > > > This is more a documentation than an optimization improvement, but if > > you are not interested in the value of any particular column, you should > > not request it in the first place; i.e., use something like: > > SELECT 0 FROM tour LIMIT 1; > > > > > > Regards, > > Clemens > > _______________________________________________ > > sqlite-users mailing list > > sqlite-users@sqlite.org > > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users