SQLite中的过分区

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

我在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 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<?)