Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化事件表的SQL查询_Sql_Database_Sqlite_Optimization_Indexing - Fatal编程技术网

优化事件表的SQL查询

优化事件表的SQL查询,sql,database,sqlite,optimization,indexing,Sql,Database,Sqlite,Optimization,Indexing,在SQLite数据库中,是一个包含事件的表,它及时记录对某个实体的更改 有数千个这样的实体,它们的参数随时间而变化,因此在每次变化时,我们都会记录变化的时间步长和整个参数集 比如说 ------------------------------------ | NodeId | tStep | Param1 | Param2 | ------------------------------------ | 1 | 92 | 90 | 20.8 | | 5 |

在SQLite数据库中,是一个包含事件的表,它及时记录对某个实体的更改

有数千个这样的实体,它们的参数随时间而变化,因此在每次变化时,我们都会记录变化的时间步长和整个参数集

比如说

------------------------------------
| 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==38

下面的
Select
工作正常,但我需要优化数据库,以便尽可能快地检索结果

SELECT NodeId, tStep, Param1, Param2, MAX(tStep) FROM EventsTable
WHERE tStep <= ?
GROUP BY NodeId;

您的查询之所以有效,是因为SQLite恰好保证了非标准的行为,并且不受任何其他数据库的支持。此外,将
min(tstep)
添加到查询中的人也有麻烦。我强烈建议不要依赖此(mis)功能

你应该做:

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

对于这个版本,您需要在
eventstable(nodeid,tstep)

上建立一个索引,但这不起作用。结果是一行包含MAX tstep和一个随机NodeId。我需要所有的NodeId,这就是我的查询工作的原因:表按NodeId分组,并在这些组中选择Max-TStep。SQLite保证了的行为。完成编辑的查询永远需要时间。正如我所解释的,表有很多记录(在我的小样本中,我们有882180条记录),这就是为什么我需要优化表。我的原始查询运行时间为0.122s,tstep=100。谢谢。@HappyCactus。请使用指定的索引进行尝试。遗憾的是,该索引无法解决此问题。查询需要永远的时间才能完成,而另一个查询只需几秒钟。这就是为什么我要求进行一些优化,甚至是预计算、数据组织、一些辅助表等等。
select et.*
from eventstable et
where et.tstep < ?
order by et.tstep desc
limit 1;
select et.*
from eventstable et
where et.tstep = (select max(et2.tstep)
                  from eventstable et2
                  where et2.nodeid = et.nodeid and et.tstep < ?
                 );