【发布时间】:2011-11-13 02:33:31
【问题描述】:
这是基于this question about query optimization的后续。
按照建议,为了快速选择,我尝试在插入时使用触发器预先计算一些数据。
基本上,我想将给定列值的出现次数保留到给定表中。
以下架构用于存储每个值的出现次数:
CREATE TABLE valuecount (value text, count int)
CREATE INDEX countidx ON t (count DESC)
CREATE UNIQUE INDEX valueidx ON valuecount (value);
这是我一直在测试的触发器:
CREATE TRIGGER counttrigger INSERT ON collection
FOR EACH ROW
BEGIN
INSERT OR REPLACE INTO valuecount VALUES
(NEW.value, coalesce((SELECT count + 1 FROM count WHERE valuecount.query LIKE
NEW.value), 1));
END;
collection 表上的典型插入包含几十万行,在单个 INSERT INTO ... SELECT ... 语句中(我正在将数据从一个数据库合并到另一个数据库)。
问题在于,使用此触发器,插入 300K 行需要 4 小时,而不是 300 毫秒 ...
有没有办法在不牺牲性能的情况下实现这一目标?
提前感谢您的帮助,
【问题讨论】:
-
您可能想尝试在 NEW 中加入更新,然后在不存在行的情况下插入 SELECT FROM NEW。
-
你能举个例子吗?
-
抱歉,我不知道At this time SQLite supports only FOR EACH ROW triggers, not FOR EACH STATEMENT triggers.。在我使用的其他数据库中,它们在
FOR EACH STATEMENT范围内运行,您可以在其中对正在更改的整个数据集进行操作。我不知道 SQLite 的这种限制,所以你不能像我在之前的评论中所说的那样去做。
标签: sql sqlite optimization triggers query-optimization