使用SQLite触发器时插入缓慢

时间:2011-12-29 20:12:23

标签: database sqlite

我在嵌入式系统上有一个小型数据库,其中有一些表我想限制为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分钟是不可接受的。

1 个答案:

答案 0 :(得分:3)

最后,我发现了问题所在。

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

这显示了索引在内部触发器中的重要性,但我仍然不明白为什么性能如此差。我想我应该看看SQLite的触发器实现来找到它。