首页 > 解决方案 > 从另一个表插入更快的 Sqlite

问题描述

我有一个 Sqlite DB,我正在对其进行更新,而且速度非常慢。我想知道我是在做最好的方法还是有更快的方法。我的桌子是:

create table files( 
    fileid integer PRIMARY KEY,
    name TEXT not null,
    sha256 TEXT,
    created INT,
    mtime INT,
    inode INT,
    nlink INT,
    fsno INT,
    sha_id INT,
    size INT not null
);

create table fls2 (
    fileid integer PRIMARY KEY,
    name TEXT not null UNIQUE, 
    size INT not null, 
    sha256 TEXT not null, 
    fs2, 
    fs3, 
    fs4, 
    fs7
);

表“文件”实际上位于名为 ttb 的附加数据库中。然后我这样做:

UPDATE fls2 
SET fs3 = (
SELECT inode || 'X' || mtime || 'X' || nlink 
FROM 
   ttb.files
WHERE 
   ttb.files.fsno = 3 
AND 
   fls2.name = ttb.files.name 
AND
   fls2.sha256 = ttb.files.sha256
);

所以这个想法是,fls2 在 'name' 中有值,这些值也存在于 ttb.files.name 中。在 ttb.files 中,我想将其他参数插入到 fls2 的相应行中。该查询有效,但我认为这两个表的匹配需要时间,我想知道是否有更有效的方法来做到这一点。fls2 中的每一列都有索引,但文件上没有索引。我将其作为事务进行,并且 pragma journal = memory (尽管 sqlite 似乎忽略了这一点,因为正在创建日志文件)。

它似乎很慢,到目前为止,每个表中大约有一百万行大约需要 90 分钟。

一个 CPU 是固定的,所以我假设它不是磁盘绑定的。

谁能建议一种更好的方式来构建查询?

编辑:解释查询计划

|--SCAN TABLE fls2
`--CORRELATED SCALAR SUBQUERY 1
   `--SCAN TABLE files

不知道这意味着什么。它为每个 SCAN TABLE fls2 命中执行 SCAN TABLE 文件?

EDIT2:好吧,天哪,Crtl-C 查询当时已经运行了 2.5 小时,退出 Sqlite,使用文件 DB 运行 sqlite,创建索引(sha256,名称) - 1 分钟左右。退出,使用主数据库运行 Sqlite。解释表明现在后面的扫描是用索引完成的。运行更新 - 需要 150 秒。与> 150分钟相比,这真是一个加速。感谢您的帮助。

TIA,皮特

标签: sqlsqlite

解决方案


fls2中的每一列都有索引

索引用于更快的选择。它们会减慢插入和更新速度。也许删除 fls2.fs3 有帮助?


推荐阅读