情况
我有两个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;
1条答案
按热度按时间j1dl9f461#
EXPLAIN结果解释了。旧*在timestamp列(idx_logs_timestamp)上有一个索引,而新没有,因此存在差异。
在new*数据库的timestamp列上创建索引。