sqlite 在不同类型的sqlit3数据库中执行长时间查询

oaxa6hgo  于 2023-02-05  发布在  SQLite
关注(0)|答案(1)|浏览(147)

情况

我有两个sqlit3数据库:

  • 新sn3.db--〉大小:122.229千字节
  • 表:日志-〉[ID:整数,变量ID:整数,数值:实时,时间戳:整数]
  • 变量:日志-〉[Id:整数,名称:文本,时间戳:整数]
  • 数据库--〉大小:180万千字节
  • 表:日志-〉[ID:整数,变量ID:整数,数值:实时,时间戳:整数]
  • 变量:日志-〉[Id:整数,名称:文本,时间戳:整数]

在这两种情况下,我都运行了这样的查询:

CREATE TEMPORARY TABLE TimestampLookup (
  TimestampStart bigint,
  TimestampEnd bigint,
  Category varchar(10)
);

INSERT INTO TimestampLookup (TimestampStart, TimestampEnd, Category)
VALUES
--(638089367345448192, 638089367391931136, '1-1'),
--(638089368588500608, 638089368635085696, '2-1'),
--(638089423052093952, 638089423097359360, '3-1'),
--(638089424602983168, 638089424646700416, '4-1'),
--(638089426835122560, 638089426880267392, '5-1'),
--(638091321516003456, 638091321616836992, '6-1'),
--(638091346537689472, 638091346646865280, '7-1'),
(638108447105669629, 638108447105669851, '8-1');

SELECT Variables.Name, Logs.Timestamp, Logs.Value, TimestampLookup.Category
FROM Logs
JOIN Variables ON Logs.VariableId = Variables.Id
JOIN TimestampLookup ON Logs.Timestamp BETWEEN TimestampLookup.TimestampStart AND TimestampLookup.TimestampEnd
ORDER BY TimestampLookup.Category ASC, Logs.Timestamp ASC;

问题

令人惊讶的是,最大的数据库"oldsn3.db"**运行查询仅需0.001秒。**但另一方面,小型数据库"newsn3.db"运行查询仅需2.5秒。
∮会是什么... ∮

  • 我真的不知道如何处理这种情况。如果有人经历过类似的情况,并希望分享这将是美妙的。

编辑

  • 作为@NickW注解,我运行解释查询计划,这是输出:
  • "新闻3.db"

| 身份证|母体|未使用的|细部|
| - ------|- ------|- ------|- ------|
| 五个|无|无|扫描日志|
| 七|无|无|使用整数主键搜索变量(行ID =?)|
| 十个|无|无|扫描时间戳查找|
| 二十六|无|无|使用临时B树作为排序依据|

  • "旧版本3.db"

| 身份证|母体|未使用的|细部|
| - ------|- ------|- ------|- ------|
| 六个|无|无|扫描时间戳查找|
| 八个|无|无|使用索引idx_logs_timestamp(时间戳〉?和时间戳〈?)搜索日志|
| 十八|无|无|使用整数主键搜索变量(行ID =?)|
| 三十|无|无|使用临时B树作为排序依据|
新查询:

CREATE TEMPORARY TABLE TimestampLookup (
  TimestampStart bigint,
  TimestampEnd bigint,
  Category varchar(10)
);

INSERT INTO TimestampLookup (TimestampStart, TimestampEnd, Category)
VALUES
--(638089367345448192, 638089367391931136, '1-1'),
--(638089368588500608, 638089368635085696, '2-1'),
--(638089423052093952, 638089423097359360, '3-1'),
--(638089424602983168, 638089424646700416, '4-1'),
--(638089426835122560, 638089426880267392, '5-1'),
--(638091321516003456, 638091321616836992, '6-1'),
--(638091346537689472, 638091346646865280, '7-1'),
(638089314046750888, 638089314046751656, '8-1');

EXPLAIN QUERY PLAN SELECT Variables.Name, Logs.Timestamp, Logs.Value, TimestampLookup.Category
FROM Logs
JOIN Variables ON Logs.VariableId = Variables.Id
JOIN TimestampLookup ON Logs.Timestamp BETWEEN TimestampLookup.TimestampStart AND TimestampLookup.TimestampEnd
ORDER BY TimestampLookup.Category ASC, Logs.Timestamp ASC;
j1dl9f46

j1dl9f461#

EXPLAIN结果解释了。旧*timestamp列(idx_logs_timestamp)上有一个索引,而没有,因此存在差异。
new*数据库的timestamp列上创建索引。

相关问题