Several places in wc_db we use the following pattern to select all
nodes with a common tree ancestor:
 WHERE wc_id = ?1 AND (local_relpath = ?2 OR local_relpath LIKE ?3 ESCAPE '#')

While this works, there was some concern about whether or not SQLite
was using the proper indicies when executing this query.  By examining
the output for 'EXPLAIN QUERY PLAN' on some of the relevant SELECT
statements, I believe it does use the indicies as intended.

However, I stumbled across an alternate implementation which I believe
has some merit.  Instead of the above clause, we could use:
 WHERE wc_id = ?1 AND substr(local_relpath, 1, length(?2)) = ?2

This also avoids a table scan by making use of the indicies, but has
the advantage of not having to compute a separate parameter for the
LIKE clause in C.  It returns the same results, and has the benefit of
being a bit more clear to SQLite what we're trying to accomplish.  I'm
tempted to switch our code to using this new format, but wanted some
comments first.  I have not yet run extensive timing or other analysis
on the performance.

Thoughts?

-Hyrum

Reply via email to