gpt4 book ai didi

sql - SQLite GROUP BY基于联合的结果不使用组成表的索引

转载 作者:行者123 更新时间:2023-12-03 19:31:33 26 4
gpt4 key购买 nike

使用以下设置:

> 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应该能够使用该表的索引将组合应用于联合中的每个表,然后将结果合并为整体结果,对吗?有什么办法暗示它应该这样做吗?我尝试将INDBYD BY添加到无济于事。

最佳答案

从理论上讲,数据库可能能够将分组应用于每个表。但是,问题在于该软件必须能够证明此转换始终有效。

使用当前的优化器实现,此查询无法被展平,因为它将违反rule 17

关于sql - SQLite GROUP BY基于联合的结果不使用组成表的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40208819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com