Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化对最常出现的值(数亿行)的检索_Java_Sql_Sqlite_Optimization_Query Optimization - Fatal编程技术网

Java 如何优化对最常出现的值(数亿行)的检索

Java 如何优化对最常出现的值(数亿行)的检索,java,sql,sqlite,optimization,query-optimization,Java,Sql,Sqlite,Optimization,Query Optimization,我试图从包含数亿行的SQLite表中检索一些最常见的值 到目前为止,查询可能如下所示: SELECT value, COUNT(value) AS count FROM table GROUP BY value ORDER BY count DESC LIMIT 10 值字段上有一个索引 然而,对于ORDERBY子句,查询花费了太多的时间,我从未看到它的结束 可以做些什么来大幅改进对如此大量数据的查询? 我试图添加HAVING子句(例如:HAVING count>100000)来减少要排序的行

我试图从包含数亿行的SQLite表中检索一些最常见的值

到目前为止,查询可能如下所示:

SELECT value, COUNT(value) AS count FROM table GROUP BY value ORDER BY count DESC LIMIT 10
字段上有一个索引

然而,对于ORDERBY子句,查询花费了太多的时间,我从未看到它的结束

可以做些什么来大幅改进对如此大量数据的查询?
我试图添加HAVING子句(例如:HAVING count>100000)来减少要排序的行数,但没有成功

请注意,我不太关心插入所需的时间(它仍然需要合理,但优先考虑选择),因此我乐于接受建议在插入时进行计算的解决方案


提前感谢,

此查询强制您查看表中的每一行。这是需要时间的

我几乎从不推荐这样做,但在这种情况下,您可以在外部表中以非规范化的方式维护计数

在插入、更新和删除过程中,通过触发器将值和计数放入另一个表。

1)创建一个新表,在该表中,每个唯一的“值”和“计数”存储一行,在计数列上放置一个降序索引
2) 在原始表中添加触发器,您可以根据需要维护此新表(插入和更新),以增加/减少计数。

3) 从这个新表中运行查询,由于递减计数索引,查询将运行得很快。Java在哪里发挥作用?以防万一,解决方案包括后期/预处理,这是我用来与db交互的语言。您使用的是什么类型的应用程序?我尝试了这个解决方案,问题是,插入现在需要很长时间。我正在做大约300K行的批插入(使用从附加数据库中选择插入),没有触发器,这只需几秒钟,有了触发器,插入到空表中需要几个小时我建议问一个新问题,在这里您给出两个表模式,触发代码,并询问如何加速触发。我会接受这个答案,谢谢你建议的描述索引。看来使用触发器毕竟不是一个好主意,但我想我应该更详细地解释我到底在做什么:)