优化事件表

时间:2018-04-19 16:08:39

标签: sql database sqlite optimization indexing

在SQLite中,db是一个包含事件的表,可以及时记录对某个实体的更改。

这些实体中有数千个,其参数随时间而变化,因此在每次更改时我们都会记录变化的时间步长和整个参数设置。

例如

------------------------------------
| NodeId | tStep | Param1 | Param2 |
------------------------------------
|   1    |  92   |  90    |  20.8  |
|   5    |  92   |  101   |  -2.4  |
|   5    |  108  |  38    |  -3.6  |
------------------------------------

我需要在特定时间点检索实体的状态,例如tStep == 100 NodeId 1, Param1 == 90 NodeId 5, Param1 == 101 tStep == 110 NodeId 1, Param1 == 90应该有NodeId 5, Param1 == 38Select

以下SELECT NodeId, tStep, Param1, Param2, MAX(tStep) FROM EventsTable WHERE tStep <= ? GROUP BY NodeId; 工作正常,但我需要优化数据库,以便尽快检索结果。

-------------------------------------------------
| NodeId | tStep | Param1 | Param2 | Max(TStep) |
-------------------------------------------------  
|  1     |  92   |  90    |   20.8 | 92         |
|  5     | 108   |  90    |     0  |  108       |
-------------------------------------------------

唯一的限制是我不能为每个tstep设置实体状态,因为它会使db变得庞大。

我可以添加索引和其他帮助表。

预期(和有效)结果:

    var list = json.Parse("type":"String","value":"Pre aprovado","valueInfo":{});

1 个答案:

答案 0 :(得分:0)

您的查询有效,因为SQLite 发生以保证非标准行为并且不受任何其他数据库支持。此外,对于向查询添加min(tstep)的人来说,有些祸了。我强烈建议不要依赖这个(误)功能。

你应该这样做:

select et.*
from eventstable et
where et.tstep < ?
order by et.tstep desc
limit 1;

对于此查询,您需要eventstable(tstep)上的索引。

编辑:

如果您需要所有节点ID:

select et.*
from eventstable et
where et.tstep = (select max(et2.tstep)
                  from eventstable et2
                  where et2.nodeid = et.nodeid and et.tstep < ?
                 );

对于此版本,您需要eventstable(nodeid, tstep)上的索引。