【发布时间】:2020-07-20 18:40:49
【问题描述】:
对于基于 SQLite3 的长期运行算法,我有一个简单但巨大的表,如下定义:
CREATE TABLE T(ID INTEGER PRIMARY KEY, V INTEGER);
算法的内部循环需要在给定某个整数N、小于或等于N的最大ID、与之关联的值V以及最小的情况下找到ID 严格大于 N。
以下一对请求确实有效:
SELECT ID, V FROM T WHERE ID <= ? ORDER BY ID DESC LIMIT 1;
SELECT ID FROM T WHERE ID > ? LIMIT 1;
但我觉得应该可以将这两个请求合并为一个请求。当 SQLite 查询主索引发现 ID 刚好小于 N(第一个请求)时,B 树索引中的下一个条目已经是第二个请求的答案。
给出一个数量级,表T有超过10亿行,内部请求需要执行超过1000亿次。因此,每一微秒都很重要。当然,我会在具有大量 RAM 的服务器上使用快速 SSD。如果 PostgreSQL 在不占用更多磁盘空间的情况下使用起来更快,那么它也是一种选择。
【问题讨论】:
-
第二个查询不是缺少
ORDER BY ID吗?否则无法保证所选 id 是可能的最小值 -
@bwt 理论上可以,但是SQLite默认总是按照主键的顺序枚举,所以排序没有效果。