1
用下面設置的索引的結果:SQLite的GROUP BY上工會不使用構成表
> CREATE TABLE test_table1(test_col INT NOT NULL);
> CREATE TABLE test_table2(test_col INT NOT NULL);
> CREATE INDEX test_index1 ON test_table1(test_col);
> CREATE INDEX test_index2 ON test_table2(test_col);
上的子查詢引用單個表做一個GROUP BY使用其指數,如所預期:
> EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM test_table1) GROUP BY test_col;
selectid order from detail
-------- ----- ---- -------------------------------------------------------
0 0 0 SCAN TABLE test_table1 USING COVERING INDEX test_index1
但在兩個表,這兩者有一個指數,工會同GROUP BY導致兩個全表掃描:
> EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM test_table1 UNION ALL SELECT * FROM test_table2) GROUP BY test_col;
selectid order from detail
-------- ----- ---- ---------------------------------------
2 0 0 SCAN TABLE test_table1
3 0 0 SCAN TABLE test_table2
1 0 0 COMPOUND SUBQUERIES 2 AND 3 (UNION ALL)
0 0 0 SCAN SUBQUERY 1
0 0 0 USE TEMP B-TREE FOR GROUP BY
至少在理論上,SQLite應該能夠使用該表的索引將聯合應用到聯合中的每個表,然後將結果合併到整體結果中,對嗎?有什麼方法可以暗示它應該這樣做嗎?我試過添加INDEXED BYs無濟於事。
不要在'group by'中使用'select *'。它在語義上沒有意義。 –