我在SQLite中遇到性能问题,在大型表上使用SELECT COUNT(*).
由于我还没有收到有用的答案,我做了一些进一步的测试,我编辑了我的问题以纳入我的新发现.
我有2张桌子:
CREATE TABLE Table1 (
Key INTEGER NOT NULL,
... several other fields ...,
Status CHAR(1) NOT NULL,
Selection VARCHAR NULL,
CONSTRAINT PK_Table1 PRIMARY KEY (Key ASC))
CREATE Table2 (
Key INTEGER NOT NULL,
Key2 INTEGER NOT NULL,
... a few other fields ...,
CONSTRAINT PK_Table2 PRIMARY KEY (Key ASC, Key2 ASC))
Run Code Online (Sandbox Code Playgroud)
Table1有大约800万条记录,Table2有大约5100万条记录,数据库文件超过5GB.
Table1还有2个索引:
CREATE INDEX IDX_Table1_Status ON Table1 (Status ASC, Key ASC)
CREATE INDEX IDX_Table1_Selection ON Table1 (Selection ASC, Key ASC)
Run Code Online (Sandbox Code Playgroud)
"状态"是必填字段,但只有6个不同的值,"选择"不是必需的,只有大约150万个值与null不同,只有大约600k个不同的值.
我在两个表上做了一些测试,你可以看到下面的时间,我为每个请求(QP)添加了"解释查询计划".我将数据库文件放在USB记忆棒上,这样我就可以在每次测试后将其删除,并获得可靠的结果,而不会干扰磁盘缓存.有些请求在USB上更快(我想由于缺少搜索时间),但有些请求更慢(表扫描).
SELECT COUNT(*) FROM …
Run Code Online (Sandbox Code Playgroud)