Hi all, Another mystery to me. Given this test table:
CREATE TABLE t (a TEXT, b TEXT, c INTEGER, PRIMARY KEY (a, b, c)) ??this query: SELECT Sum(c) FROM t GROUP BY a ??executes faster than any of these two: SELECT Sum(c) FROM t GROUP BY b SELECT Sum(c) FROM t GROUP BY c ? which executes in about the same time together, proportionally to the number of returned rows. With `GROUP BY a`, execution times seems to be about half than with the two formers. Adding or not adding a `WITHOUT ROWID` gives the same. I give the number of rows, to show if the first one is faster than the second one, that's not because it would returns less rows, on the opposite, it returns a bit more then with grouping by `b`: * Grouping by `a` results into 1360 rows in about 40ms +/-3; * Grouping by `b` results into 1170 rows in about 65ms +/-5; * Grouping by `c` results into 3154 rows in about 90ms +/-4. If the primary key declaration is removed, timing when grouping by `b` or `c` does not change, while timing when grouping by `a` become the same as with the two formers. I feel to witness this with both SQlite3 CLI and SQLiteBrowser (a detail I must mention after another thread). Is there any thing special with the first column of a composite primary key? From an implementation point of view, this may makes sense, but I still prefer to ask. I first noticed this another way. This test was just to check on a simpler case. Initially, I indirectly noticed this with something similar to this: SELECT b, Sum(c) AS c FROM (SELECT b, Sum(c) AS c FROM t GROUP BY a, b) GROUP BY b -- 60 ms on average ? being faster than this second simpler alternative, something I notice with the test table too, just that the difference is less: SELECT b, Sum(c) AS c FROM t GROUP BY b -- 65 to 70 ms on average ? although the first one seems to run more operations, and it's still the same if I add an index on `b` for the second alternative and thus it does not use a temporary B?tree for grouping. I also noticed some other cases where queries executes faster on the first column of a composite key (with or without indexes), but I won't expose all cases, as I'm already too lengthy. Enough testing for now, I will resume the investigations on this unexpected results, later. -- Yannick Duch?ne