sql - SQLite触发器优化

标签 sql sqlite optimization triggers query-optimization

这是基于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/

相关文章:

php - PDO INSERT 不适用于 $_POST 变量

mysql - LOAD 是关系代数运算符吗?

android - 搜索存储在 sqlite 数据库中的字符串的最快方法

python - 更有效地到达最近的中心

php - 将一个查询分成四个以避免大量连接?

MySQL:优化连接

php - MySQL 如果一个或多个行因为不存在而未更新,则将它们插入 [ WHERE IN ]

mysql - SQL按类别平均列

android - Android中的全文搜索示例

sqlite - 如何在SQFlite中插入POJO对象和列表