【问题标题】:Slow insertions when using SQLite triggers使用 SQLite 触发器时插入速度慢
【发布时间】:2011-12-29 20:12:23
【问题描述】:

我在嵌入式系统上有一个小型数据库,其中包含一些我想限制为 1000 行的表。为此,我设置了一个触发器,该触发器在每次插入新行后执行。触发器的代码是:

CREATE TRIGGER after_insertion_trigger
AFTER INSERT ON table
BEGIN
    DELETE FROM table
    WHERE uuid IN (
        SELECT uuid FROM table ORDER BY sent ASC, timestamp DESC LIMIT -1 OFFSET 1000
    );
END;

问题是,在使用触发器时插入一个完整的表每次需要超过 3 分钟而不是 0.4 秒,这是完成插入和删除语句的正常事务所需的时间。

使用触发器完成插入所需的时间似乎也随着数据库行的增加而增加。

我在 Stack Overflow 和其他有关触发器的网站上发现了许多不同的线程,但没有一个能帮助我解决问题。我正在使用 SQLite 3.7.9。

有人知道为什么我的表现这么差吗?我不需要很大的性能,因为插入不会经常发生,但是插入 3 分钟是不可接受的。

【问题讨论】:

标签: database sqlite


【解决方案1】:

终于找到问题所在了。

触发器非常慢,因为“uuid”字段不是索引(数据库架构未优化)。将 'uuid' 字段设置为主键后,现在插入大约需要 0.7 秒。

这显示了触发器内部索引的重要性,但我仍然不明白为什么性能如此糟糕。我想我应该看看 SQLite 的触发器实现来找出答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2021-11-07
    • 2018-09-02
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多