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を無駄に追加しようとしました。
'group by 'で' select *'を使わないでください。意味論的に意味をなさない。 –