这是基于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 ms ...
有没有办法在不牺牲性能的情况下实现这一目标?
在此先感谢您的帮助,
最佳答案
由于从一个数据库导入到另一个数据库并不像其他插入操作那样常见,因此可以将触发器提供的逻辑推迟到导入完成之前吗?查看触发器的性质,似乎可以在导入所有数据之后为每种查询类型执行COUNT个操作。总体而言,这将大大减少查询。
如果这不可能,是否有避免使用LIKE的方法?此操作比直接比较昂贵。
关于sql - SQLite触发器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7350432/