2016-10-23 5 views
1

を使用していない:SQLiteのGROUP BYは、労働組合の結果に、次の設定で構成テーブルのインデックス

予想通り、単一のテーブルには、そのインデックスを使用して参照するサブクエリに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); 

> 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 

しかしインデックスが両方とも2つのテーブルの結合に同じGROUP BY、2回のフルテーブルスキャンで結果:

> 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 BYを無駄に追加しようとしました。

+0

'group by 'で' select *'を使わないでください。意味論的に意味をなさない。 –

答えて

1

データベースは理論的には各テーブルにグループ化を適用できる可能性があります。しかし、問題は、この変換が常に有効であることをソフトウェアが証明できなければならないことです。

現在のオプティマイザの実装では、rule 17に違反するため、このクエリはフラット化できません。

関連する問題