sql - 从另一个表插入更快的 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,皮特
解决方案
fls2中的每一列都有索引
索引用于更快的选择。它们会减慢插入和更新速度。也许删除 fls2.fs3 有帮助?
推荐阅读
- ios - 在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题
- javascript - 角模态不会随着组件变量的变化而更新
- hibernate - Hibernate - 具有聚合功能的 COALESCE 不适用于空数据库
- appium - 由于 xcodebuild 失败,无法启动 WebDriverAgent:“xcodebuild failed with code 65
- java - 如何确定异常处理程序的响应状态?
- php - header('Content-Type: image/jpeg') 使网站变成黑色
- python-3.x - 我们如何知道模型在训练用于对象分类/检测的神经网络时收敛?
- javascript - 如何在反应的选择标签中填充编辑模式下的值?
- php - php 服务器 - 新文件上的 500 错误消息
- ios - 依次运行 3 个 observable,使用最后一个中的第一个结果