280db65e2c
FossilOrigin-Name: 159e8022a9d6701532b8b60e0c41154bc434c1bbdb107c8c97a78fb1140fa745 |
||
---|---|---|
.. | ||
expert1.test | ||
expert.c | ||
README.md | ||
sqlite3expert.c | ||
sqlite3expert.h | ||
test_expert.c |
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:
-
The user database schema is copied to a temporary database.
-
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.
-
The information gathered in step 2 is used to create (possibly a large number of) candidate indexes.
-
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:
-
An sqlite3expert object is created by calling sqlite3_expert_new(). A database handle opened by the user is passed as an argument.
-
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.
-
sqlite3_expert_analyze() is called to run the analysis.
-
One or more calls are made to sqlite3_expert_report() to extract components of the results of the analysis.
-
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