sqlite/ext/expert
dan a6ed5a4f39 Have sqlite3_expert_analyze() populate the sqlite_stat1 table before running
queries through the planner for the second time.

FossilOrigin-Name: a157fcfde5afc27ae38e7cf4669fcc8e60e23d9d301ffe2e541dd69f895b493b
2017-04-18 20:10:16 +00:00
..
expert1.test Have sqlite3_expert_analyze() populate the sqlite_stat1 table before running 2017-04-18 20:10:16 +00:00
expert.c Fix sqlite3_expert handling of triggers on views. 2017-04-18 09:04:48 +00:00
README.md Add ext/expert/README.md. 2017-04-10 20:00:26 +00:00
sqlite3expert.c Have sqlite3_expert_analyze() populate the sqlite_stat1 table before running 2017-04-18 20:10:16 +00:00
sqlite3expert.h Add header comments to the API functions in sqlite3expert.h. Include a list of 2017-04-11 17:43:12 +00:00
test_expert.c Have sqlite3_expert_analyze() populate the sqlite_stat1 table before running 2017-04-18 20:10:16 +00:00

SQLite Expert Extension

This folder contains code for a simple system to propose useful indexes given a database and a set of SQL queries. It works as follows:

  1. The user database schema is copied to a temporary database.

  2. All SQL queries are prepared against the temporary database. The sqlite3_whereinfo_hook() API is used to record information regarding the WHERE and ORDER BY clauses attached to each query.

  3. The information gathered in step 2 is used to create (possibly a large number of) candidate indexes.

  4. The SQL queries are prepared a second time. If the planner uses any of the indexes created in step 3, they are recommended to the user.

No ANALYZE data is available to the planner in step 4 above. This can lead to sub-optimal results.

This extension requires that SQLite be built with the SQLITE_ENABLE_WHEREINFO_HOOK pre-processor symbol defined.

C API

The SQLite expert C API is defined in sqlite3expert.h. Most uses will proceed as follows:

  1. An sqlite3expert object is created by calling sqlite3_expert_new(). A database handle opened by the user is passed as an argument.

  2. The sqlite3expert object is configured with one or more SQL statements by making one or more calls to sqlite3_expert_sql(). Each call may specify a single SQL statement, or multiple statements separated by semi-colons.

  3. sqlite3_expert_analyze() is called to run the analysis.

  4. One or more calls are made to sqlite3_expert_report() to extract components of the results of the analysis.

  5. sqlite3_expert_destroy() is called to free all resources.

Refer to comments in sqlite3expert.h for further details.

sqlite3_expert application

The file "expert.c" contains the code for a command line application that uses the API described above. It can be compiled with (for example):

  gcc -O2 -DSQLITE_ENABLE_WHEREINFO_HOOK sqlite3.c expert.c sqlite3expert.c -o sqlite3_expert

Assuming the database is "test.db", it can then be run to analyze a single query:

  ./sqlite3_expert -sql <sql-query> test.db

Or an entire text file worth of queries with:

  ./sqlite3_expert -file <text-file> test.db