2016-10-23 41 views
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無濟於事。

+0

不要在'group by'中使用'select *'。它在語義上沒有意義。 –

回答

1

理論上,數據庫可能會將分組應用於每個表。但問題是軟件必須能夠證明這種轉換總是有效的。

使用當前的優化器實現,此查詢不能被平攤,因爲它會違反rule 17