On Tue, Jul 8, 2014 at 11:01 AM, Hinrichsen, John <jhinrich...@c10p.com> wrote:
> Hi, > > Would you consider changing the column affinity determination rules Probably not. There are over a half million apps (literally) in circulation that use the existing rules. Changing the rules would break some fraction of those half-million apps, which would likely be very annoying to the developers. > so that > expressions would, at least in easy-to-deduce cases, automatically assign > the appropriate column affinity? > > Making this change would improve the performance of some queries (see my > original email.) > > It would be more intuitive: why should aggregate functions like min(), > max(), and sum() return column data stripped of the original column > affinity? > > > On Fri, May 23, 2014 at 2:21 PM, Hinrichsen, John <jhinrich...@c10p.com> > wrote: > > > At table creation time, when column types are not declared explicitly, or > > are produced by an expression, column affinity defaults to NONE, with the > > result that indexes added afterwards often go unused in joins because of > a > > column affinity mismatch. > > > > Adding casts around the expressions is an effective way to enforce column > > affinities, at the expense of redundant code. Column types that could be > > declared in just one place, or simply inferred, have to be repeatedly > > re-declared via casts. I assume that this is a result of sqlite's > manifest > > typing. > > > > Would you consider changing the column affinity determination rules such > > that expressions could, at least in easy-to-deduce cases, automatically > > assign the appropriate column affinity? > > > > My colleague Ivan, who diagnosed the issue, put the following repro > > together to illustrate the problem. He uses the syntax "a JOIN b ON b.x > > IN (a.x)" and compares its query plan and performance to that of using > > the standard join syntax. He also requests the query planner to > > specifically use the index within the context of the normal join syntax, > > which the query planner rejects. > > > > $ sqlite3 > > SQLite version 3.8.4.3 2014-04-03 16:53:12 > > Enter ".help" for usage hints. > > Connected to a transient in-memory database. > > Use ".open FILENAME" to reopen on a persistent database. > > sqlite> > > sqlite> CREATE TEMP TABLE z AS > > ...> WITH RECURSIVE cnt(x) AS ( > > ...> VALUES(1) UNION ALL SELECT x+1 FROM cnt > > ...> WHERE x < 1e6 > > ...> ) SELECT x FROM cnt; > > sqlite> > > sqlite> CREATE TABLE a(x INTEGER NOT NULL PRIMARY KEY); > > sqlite> INSERT INTO a SELECT x FROM temp.z; > > sqlite> > > sqlite> CREATE TABLE b AS SELECT x FROM temp.z; > > sqlite> CREATE UNIQUE INDEX b_idx_1 ON b(x); > > sqlite> > > sqlite> ANALYZE; > > sqlite> > > sqlite> PRAGMA table_info(a); > > cid name type notnull dflt_value pk > > ---------- ---------- ---------- ---------- ---------- ---------- > > 0 x INTEGER 1 1 > > sqlite> PRAGMA table_info(b); > > cid name type notnull dflt_value pk > > ---------- ---------- ---------- ---------- ---------- ---------- > > 0 x 0 0 > > sqlite> PRAGMA index_info(b_idx_1); > > seqno cid name > > ---------- ---------- ---------- > > 0 0 x > > sqlite> EXPLAIN QUERY PLAN > > ...> SELECT * FROM a JOIN b ON a.x = b.x AND a.x = 123; > > selectid order from detail > > ---------- ---------- ---------- > > -------------------------------------------------- > > 0 0 0 SEARCH TABLE a USING INTEGER PRIMARY > > KEY (rowid=?) > > 0 1 1 SCAN TABLE b > > sqlite> EXPLAIN QUERY PLAN > > ...> SELECT * FROM a JOIN b INDEXED BY b_idx_1 ON a.x = b.x AND a.x = > > 123; > > Error: no query solution > > > > sqlite> EXPLAIN QUERY PLAN > > ...> SELECT * FROM a JOIN b ON b.x IN (a.x) AND a.x = 123; > > selectid order from detail > > ---------- ---------- ---------- > > -------------------------------------------------- > > 0 0 0 SEARCH TABLE a USING INTEGER PRIMARY > > KEY (rowid=?) > > 0 1 1 SEARCH TABLE b USING COVERING INDEX > > b_idx_1 (x=?) > > 0 0 0 EXECUTE LIST SUBQUERY 1 > > sqlite> .timer on > > sqlite> SELECT * FROM a JOIN b ON a.x = b.x AND a.x = 123; > > x x > > ---------- ---------- > > 123 123 > > Run Time: real 0.157 user 0.155976 sys 0.000000 > > > > sqlite> SELECT * FROM a JOIN b ON b.x IN (a.x) AND a.x = 123; > > x x > > ---------- ---------- > > 123 123 > > Run Time: real 0.000 user 0.000000 sys 0.000000 > > sqlite> > > > > -- > > This message contains confidential information and is intended only for the > individual named. If you are not the named addressee, you should not > disseminate, distribute, alter or copy this e-mail. Please notify the > sender immediately by e-mail if you have received this e-mail by mistake > and delete this e-mail from your system. E-mail transmissions cannot be > guaranteed to be secure or without error as information could be > intercepted, corrupted, lost, destroyed, or arrive late or incomplete. The > sender, therefore, does not accept liability for any errors or omissions in > the contents of this message which arise during or as a result of e-mail > transmission. If verification is required, please request a hard-copy > version. This message is provided for information purposes and should not > be construed as a solicitation or offer to buy or sell any securities or > related financial instruments in any jurisdiction. > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users