【问题标题】:Results from two queries at once in sqlite?在 sqlite 中一次来自两个查询的结果?
【发布时间】:2011-02-11 10:37:38
【问题描述】:

我目前正在尝试优化从 SQLite 数据库中检索日志条目页面的缓慢过程。

我注意到我几乎总是检索下一个条目以及可用条目的计数:

        SELECT time, level, type, text FROM Logs
         WHERE level IN (%s)
         ORDER BY time DESC, id DESC
         LIMIT LOG_REQ_LINES OFFSET %d* LOG_REQ_LINES ;

连同可以匹配当前查询的记录总数:

        SELECT count(*) FROM Logs WHERE level IN (%s);

(用于显示“第 n 页,共 m”)

我想知道,我是否可以连接这两个查询,并在一个 sqlite3_exec() 中简单地连接查询字符串来询问它们。我的回调函数应该怎么看呢?我可以通过argc区分不同类型的数据吗?

您还有什么其他优化建议?

【问题讨论】:

    标签: c++ sql c optimization sqlite


    【解决方案1】:

    您可以使计数查询返回与选择查询相同的列数,并为计数查询和选择查询创建一个UNION

    结果集的第一行将包含总计数。

    sqlite-users 邮件列表的the post about SQL_CALC_FOUND_ROWS 中描述了另一种可能的解决方案。

    还有一个关于你的选择查询的小提示:如果你用datetime('now')将记录插入到Log表中,并且id是表的自动递增主键,那么不需要按时间排序,它就足够了按id DESC排序。由于自动递增的主键字段是 ROWID 的别名,因此您将获得显着的性能提升。

    顺便说一句,time 是 SQLLite 中的内置函数,因此您应该用反引号 (`) 引用列名。

    【讨论】:

    • 实际上,由于 DST 变化和时钟调整,最初认为按时间排序是必要的。然后它被认为肯定会适得其反(将 DST 更改前后的日志混合在一起)并随后被废弃。
    【解决方案2】:

    您可以将查询与 sqlite3_get_table 函数一起使用来收集行
    并获取结果行数。

    【讨论】:

      【解决方案3】:

      您可以使用triggers 在单独的表格中记录每个级别的条目数。触发器需要在插入条目时增加计数,并在删除条目时减少计数。

      例子:

      create table Log_counts (level primary key, count);
      
      create trigger Log_insert_trigger after insert on Logs
        for each row
        begin
          update Log_counts set count = count + 1 where level = new.level;
        end;
      
      create trigger Log_delete_trigger after delete on Logs
        for each row
        begin
          update Log_counts set count = count - 1 where level = old.level;
        end;
      

      您需要使用每个级别的计数来初始化Log_counts;在一个空的数据库中,对于每个级别...

      insert into Log_counts (level, count) values (%s, 0);
      

      那么您将不需要对显示的每一页进行 count(*) 查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多