Merge pull request #150 from ddunbar/optimize-rule-dep-search
Optimize the rule dependency search query.
diff --git a/lib/Core/SQLiteBuildDB.cpp b/lib/Core/SQLiteBuildDB.cpp
index b9e7fef..216bb9f 100644
--- a/lib/Core/SQLiteBuildDB.cpp
+++ b/lib/Core/SQLiteBuildDB.cpp
@@ -193,8 +193,21 @@
// Create an index to be used for efficiently looking up rule
// information from a key.
result = sqlite3_exec(
- db, "CREATE UNIQUE INDEX rule_results_idx ON rule_results (key_id);",
- nullptr, nullptr, &cError);
+ db, "CREATE UNIQUE INDEX rule_results_idx ON rule_results (key_id);",
+ nullptr, nullptr, &cError);
+ }
+
+ // Create a covering index for dependency queries.
+ //
+ // This is rather inefficient, because the rule_dependencies table is
+ // almost covering, but without this the dependency query is considerably
+ // more expensive -- this index alone is good for almost 10% on a null
+ // build of a large graph.
+ if (result == SQLITE_OK) {
+ result = sqlite3_exec(
+ db, ("CREATE UNIQUE INDEX rule_dependencies_idx "
+ "ON rule_dependencies (rule_id, ordinal, key_id);"),
+ nullptr, nullptr, &cError);
}
// Sync changes to disk.