我在嵌入式系统上有一个小型数据库,其中有一些表我想限制为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分钟是不可接受的。
答案 0 :(得分:3)
最后,我发现了问题所在。
触发器非常慢,因为'uuid'字段不是索引(数据库架构未优化)。将'uuid'字段设置为主键后,插入现在大约需要0.7秒。
这显示了索引在内部触发器中的重要性,但我仍然不明白为什么性能如此差。我想我应该看看SQLite的触发器实现来找到它。