SQLite中的过分区
我在SQLite数据库中有一个表,列为DATE、GROUP。我想选择每组的前10个条目。在研究了stackoverflow上的类似主题后,我提出了以下查询,但运行速度非常慢。有没有办法加快速度SQLite中的过分区,sqlite,Sqlite,我在SQLite数据库中有一个表,列为DATE、GROUP。我想选择每组的前10个条目。在研究了stackoverflow上的类似主题后,我提出了以下查询,但运行速度非常慢。有没有办法加快速度 select * from TABLE as A where (select count(*) from TABLE as B where B.DATE < A.DATE and A.GROUP == B.GROUP) < 10 这是EXPLAIN QUERY PLAN T
select * from TABLE as A
where (select count(*) from TABLE as B
where B.DATE < A.DATE and A.GROUP == B.GROUP) < 10
这是EXPLAIN QUERY PLAN TABLE=clients\u bets的结果:
以下是一些建议: 使用覆盖索引包含子查询中所需的所有数据的索引,在本例中为组和日期
create index some_index on some_table(some_group, some_date)
此外,重写要生成的子查询不太依赖于外部查询:
select * from some_table as A
where rowid in (
select B.rowid
from some_table as B
where A.some_group == B.some_group
order by B.some_date limit 10 )
查询计划更改为:
0 0 0 SCAN TABLE some_table AS A
0 0 0 EXECUTE CORRELATED LIST SUBQUERY 1
1 0 0 SEARCH TABLE some_table AS B USING COVERING INDEX idx_1 (some_group=?)
到
虽然非常相似,但查询速度似乎相当快。我不知道为什么
显示此查询的表定义和的输出。@CL不完全确定表定义是什么意思,但它包含许多~50+其他列,除了日期和组之外,日期是文本,组是INT。我在问题中添加了解释查询计划的输出。@JosefOndrej您有关于日期和组的索引吗?为什么数据库必须对内部查询执行扫描?您无法避免外部完全扫描,因为您在筛选之前要求每一行的运行总数。@PanagiotisKanavos否我在这些列上没有任何索引。现在,当我添加它们时,查询所需的时间减少了10倍,在解释查询计划输出中,第三行现在是使用索引搜索表clients_bets AS B…覆盖索引帮助将时间进一步减少了7倍,但是重写查询似乎不是一个好主意,因为它比我最初的建议慢了2倍。有趣的是,在我的测试中,速度要快得多。另一个例子说明了为什么使用真实数据进行概要分析很重要
0 0 0 SCAN TABLE some_table AS A
0 0 0 EXECUTE CORRELATED SCALAR SUBQUERY 1
1 0 0 SEARCH TABLE some_table AS B USING COVERING INDEX idx_1 (some_group=? AND some_date<?)