Sqlite速度慢,但几乎不使用机器资源

Sqlite速度慢,但几乎不使用机器资源,sqlite,Sqlite,我有一个500 MB的sqlite数据库,大约有500万行,其模式如下: CREATE TABLE my_table ( id1 VARCHAR(12) NOT NULL, id2 VARCHAR(3) NOT NULL, date DATE NOT NULL, val1 NUMERIC, val2 NUMERIC, val2 NUMERIC, val4 NUMERIC,

我有一个500 MB的sqlite数据库,大约有500万行,其模式如下:

CREATE TABLE my_table (
        id1 VARCHAR(12) NOT NULL,
        id2 VARCHAR(3) NOT NULL,
        date DATE NOT NULL,
        val1 NUMERIC,
        val2 NUMERIC,
        val2 NUMERIC,
        val4 NUMERIC,
        val5 INTEGER,
        PRIMARY KEY (id1, id2, date)
);
我正在尝试运行:

SELECT count(ROWID) FROM my_table
查询现在已经运行了几分钟,我觉得这太过分了。我知道sqlite没有针对count(*)类型的查询进行优化

我可以接受这一点,至少我的机器工作起来很努力。然而,我的CPU负载徘徊在0-1%左右。Process Explorer中的“磁盘增量总字节”约为500.000。


你知道这是否可以加快速度吗?

你应该为你这样查询的任何字段建立索引<代码>创建索引标签\在标签(标签)上建立索引。那么,我肯定查询速度会更快。其次,尝试规范化您的表并进行测试(没有索引)。比较结果。

在大多数情况下,
count(*)
count(rowid)

如果您有一个(非部分)索引,那么使用它可以更快地计算行数,因为需要从磁盘加载的数据更少。
在这种情况下,主键约束已经创建了这样一个索引。

如果我是你,我会尝试查看我的磁盘IO。我想它们相当高。考虑到数据库的大小,一些数据必须在磁盘上,这使其成为瓶颈

根据我对SQLite的基本知识,我有两个想法

想法1:如果内存在您的情况下不是问题,并且您的应用程序启动一次并运行多个查询,我会尝试增加使用的缓存量(有一个
cache\u size
pragma可用)。在几次谷歌搜索后,我找到了关于SQLite调整的链接:


想法2:我将尝试使用一个自动递增的主键(在单个列上),并尝试使用my_表中的
SELECT COUNT(DISTINCT row_id)来调整我的请求。这可能会迫使计数只在索引中包含的内容上运行。

我的主键有什么问题?这已经是一个索引。据我所知,表在3NF中。“到处索引”策略并没有加快所有速度,我怀疑在这样的表上不带where子句的计数是否可以加快。计数(*)也有同样的问题:机器资源使用率低。我理解正确了吗?你是说我的模式及其主键原则上是可以的?什么操作系统?什么文件系统?任何病毒扫描程序?SQLite不支持并发访问。一旦事务启动,它就会锁定表。您确定在同一数据库上的事务中没有其他进程处于空闲状态吗?@CL Windows Server 2003 R2,Symantec EndpointProtection@aruisdante这是否意味着查询永远不会完成?在我的情况下,它是,但它是缓慢的。什么文件系统?这是在网络上吗?我有0.5MB/s的磁盘IO,这不是微不足道的,但留下了很大的空间。。。重新启动系统后,我现在的磁盘IO速度为3-4 MB/s:这要好得多,但仍然很好。不知道是什么导致了这种速度加快,也不知道为什么我会以3-4MB/s的速度达到最高。我将尝试一下您的想法,但我认为必须重新启动系统以避免系统缓存伪造结果。