我正在学习SQLite(由Python调用)。
根据我之前的问题(Reorganising Data in SQLLIte),我想在我的数据库中存储多个时间序列(训练数据)。
我已经定义了以下字段:
CREATE TABLE VARLIST
(
VarID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL
)
CREATE TABLE DATAPOINTS
(
DataID INTEGER PRIMARY KEY,
timeID INTEGER,
VarID INTEGER,
value REAL
)
CREATE TABLE TIMESTAMPS
(
timeID INTEGER PRIMARY KEY AUTOINCREMENT,
TRAININGS_ID INT,
TRAINING_TIME_SECONDS FLOAT
)
VARLIST
有8个条目,TIMESTAMPS
1e5条目和DATAPOINTS
大约5e6。
当我现在想要提取给定TrainingsID
和VarID
的数据时,我会尝试:
SELECT
(SELECT TIMESTAMPS.TRAINING_TIME_SECONDS
FROM TIMESTAMPS
WHERE t.timeID = timeID) AS TRAINING_TIME_SECONDS,
(SELECT value
FROM DATAPOINTS
WHERE DATAPOINTS.timeID = t.timeID and DATAPOINTS.VarID = 2) as value
FROM
(SELECT timeID
FROM TIMESTAMPS
WHERE TRAININGS_ID = 96) as t;
命令EXPLAIN QUERY PLAN
提供:
0|0|0|SCAN TABLE TIMESTAMPS
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE TIMESTAMPS USING INTEGER PRIMARY KEY (rowid=?)
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2
2|0|0|SCAN TABLE DATAPOINTS
这基本上有效 但有两个问题:
小问题:如果timeID
没有请求VarID is availabe, I get an line with the value
无数据的数据。
我希望跳过这一行。
大问题:搜索速度极慢(使用http://sqlitebrowser.org/约5分钟)。
如何最好地改善表现?
是否有更好的方法来制定SELECT
命令,还是应该修改数据库结构本身?
答案 0 :(得分:1)
好的,基于我得到的提示,我可以通过applie的INDEXES极速加速搜索:
CREATE INDEX IF NOT EXISTS DP_Index on DATAPOINTS (VarID,timeID,DataID);
CREATE INDEX IF NOT EXISTS TS_Index on TIMESTAMPS(TRAININGS_ID,timeID);
EXPLAIN QUERY PLAN
输出现在显示为:
0|0|0|SEARCH TABLE TIMESTAMPS USING COVERING INDEX TS_Index (TRAININGS_ID=?)
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE TIMESTAMPS USING INTEGER PRIMARY KEY (rowid=?)
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2
2|0|0|SEARCH TABLE DATAPOINTS USING INDEX DP_Index (VarID=? AND timeID=?)
感谢您的评论。