1. The user database schema is copied to a temporary database.
- 1. 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.
+ 1. All SQL queries are prepared against the temporary database. I
+ Information regarding the WHERE and ORDER BY clauses, and other query
+ features that affect index selection, are recorded.
1. The information gathered in step 2 is used to create (possibly a large
number of) candidate indexes.
+ 1. A subset of the data in the user database is used to generate statistics
+ for all existing indexes and the candidate indexes generated in step 3
+ above.
+
1. 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
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.
+
+ 1. Optionally, the **sqlite3\_expert\_config()** API may be used to
+ configure the size of the data subset used to generate index statistics.
+ Using a smaller subset of the data can speed up the analysis.
1. **sqlite3\_expert\_analyze()** is called to run the analysis.
uses the API described above. It can be compiled with (for example):
<pre>
- gcc -O2 -DSQLITE_ENABLE_WHEREINFO_HOOK sqlite3.c expert.c sqlite3expert.c -o sqlite3_expert
+ gcc -O2 sqlite3.c expert.c sqlite3expert.c -o sqlite3_expert
</pre>
-Assuming the database is "test.db", it can then be run to analyze a single query:
+Assuming the database is named "test.db", it can then be run to analyze a
+single query:
<pre>
./sqlite3_expert -sql <sql-query> test.db
./sqlite3_expert -file <text-file> test.db
</pre>
+By default, sqlite3_expert generates index statistics using all the data in
+the user database. For a large database, this may be prohibitively time
+consuming. The "-sample" option may be used to configure sqlite3_expert to
+generate statistics based on an integer percentage of the user database as
+follows:
+<pre>
+ # Generate statistics based on 25% of the user database rows:
+ ./sqlite3_expert -sample 25 -sql <sql-query> test.db
-
+ # Do not generate any statistics at all:
+ ./sqlite3_expert -sample 0 -sql <sql-query> test.db
+</pre>
-C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
-D 2017-04-20T17:35:46.403
+C Update\sthe\sREADME.md\sfile\sin\sthe\sext/expert/\sdirectory.
+D 2017-04-21T19:53:39.781
F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 6a8c838220f7c00820e1fc0ac1bccaaa8e5676067e1dbfa1bafa7a4ffecf8ae6
F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91
F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74
F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef
-F ext/expert/README.md 9f15075ec5ad772808eff55ef044c31140fd1146aa0a3c47eafd155e71851b01
+F ext/expert/README.md 58a5af07981d6946464eb4b069f36a18dff1d594bcf331a02b4485dac5cd5207
F ext/expert/expert.c 33842ef151d84c5f8000f9c7b938998c6b999eaef7ce1f4eeb0df8ffe6739496
F ext/expert/expert1.test 1033e43071b69dc2f4e88fbf03fc7f18846c9865cac14f28c80f581437f09acb
F ext/expert/sqlite3expert.c 4bc1820a70d68b478884a26a2215df8c1f2d44fb40d9cd8c47d2046c8ce0c8bc
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4e366996434e63f06cc451d2011f1f1464360f03430b8260e48f78a612b4e9d6 6b21d0fdebdccfaf63590d9ca9a279c22b8baec07c1a669b9f617f25bd857384
-R 3ff876810132a5a27eb9c4a943446c06
+P b1533bc455f52f570c0f4b8aaa0da802757dc89b0e45b9a9b31aa591a44bf7bd
+R 1bfa4bacff37532498e779dfe65e0523
U dan
-Z 9bcc0d98d05bcef127f4de36c5b9d364
+Z 425c38161b659ffbe58ff987543a301c