Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
为什么SQLITE在一个简单的计数查询上花费了很长时间?_Sql_Database_Sqlite_Database Tuning - Fatal编程技术网

为什么SQLITE在一个简单的计数查询上花费了很长时间?

为什么SQLITE在一个简单的计数查询上花费了很长时间?,sql,database,sqlite,database-tuning,Sql,Database,Sqlite,Database Tuning,我有一组SQLITE表,它们在磁盘上的总容量为7GB。我查询的特定表FQ大约有50列和300万行 我正在从sqlite3交互式shell sqlite3.exe进行查询。我正在运行的查询是:选择countDate from FQ;。大约300万行需要10分钟以上的时间来计算。第一次之后,它似乎被缓存,结果几乎是即时的。我在一台Windows10电脑上运行,内存为8GB,其他什么都不运行 Date是两个主键之一,即Date和ID。有360个唯一的日期和~8-10k ID,表中每个日期/ID组合有一

我有一组SQLITE表,它们在磁盘上的总容量为7GB。我查询的特定表FQ大约有50列和300万行

我正在从sqlite3交互式shell sqlite3.exe进行查询。我正在运行的查询是:选择countDate from FQ;。大约300万行需要10分钟以上的时间来计算。第一次之后,它似乎被缓存,结果几乎是即时的。我在一台Windows10电脑上运行,内存为8GB,其他什么都不运行

Date是两个主键之一,即Date和ID。有360个唯一的日期和~8-10k ID,表中每个日期/ID组合有一个条目

以下是我已经做过的一些事情:

我在整张桌子上都有一个覆盖索引。 我已经在这个数据库上运行了分析。 当我执行EXPLAIN查询计划时,它说它正在按照预期进行表扫描,以便使用覆盖索引进行计数。 对一个300万行的表进行简单扫描怎么可能需要这么长时间

[编辑:我应该澄清一下,我对其他计数方式不感兴趣-我希望扫描速度不要太慢,也不要太慢,例如,使用sum+group by]


[更新:今天我尝试了另外两件事-首先,我尝试在没有ROWID的情况下使用,结果都很相似。然后,我删除了所有表的索引。现在,数百万行的计数在4秒钟内完成。数据库文件自然比7 GB小2 GB,因为所有索引都没有了,但这不应该解释在10分钟到4秒的时间内就有点不同了!是什么使覆盖索引减慢了表扫描?是否存在扫描索引较慢的情况,如果是这样,为什么SQLITE不直接扫描原始表本身?]

我终于解决了问题。在数据库上运行真空命令解决了问题。我运行了.dbinfo以确认页面大小乘以总页数,大约等于文件大小。再加上我没有从数据库中删除任何内容,只是插入,这让我认为我没有去真空或去碎片


但真空的重新组织似乎也对计数查询的速度产生了巨大的影响,正如我在其他地方看到的那样,计数查询现在以毫秒为单位完成。

从fq中选择count*需要多长时间?第一次没有缓存任何内容可能是其中的一部分,是的。@GordonLinoff,使用*使其以毫秒为单位完成g或更长时间-很难说得很清楚,因为缓存很难控制。@Shawn,很公平,没有缓存会减慢它的速度,但我可以将整个数据库文件7 GB复制到一个USB硬盘,时间比计算一个表中的300万行要短。即使没有任何缓存,我也不认为它会占用这个时间ng还是?@jwcoder…in count*实际上使查询更快而不是更慢。数据库引擎知道它可以使用任何索引或数据页来计算行数。很高兴知道。感谢您分享解决方案并标记您的问题答案。我不会猜到真空将是解决方案。非常感谢。@zedfoxus-没问题,这里有这么多答案让我受益匪浅,这是我至少能做的!: