SQL Server中时间序列数据的快速访问阵列
我有一堆日志文件,保存着来自传感器的各种速率时间序列数据(一些1Hz,一些10Hz)。数据目前分布在几个不同的文件和文件格式(csv、xml、csv的屠宰版本等)。因此,我想将数据存储在数据库中,以便更容易访问、查询等 作为现在的设置,我对传感器的每次读数都使用一行(请参见下面的SQL Server中时间序列数据的快速访问阵列,sql,arrays,sql-server,tsql,Sql,Arrays,Sql Server,Tsql,我有一堆日志文件,保存着来自传感器的各种速率时间序列数据(一些1Hz,一些10Hz)。数据目前分布在几个不同的文件和文件格式(csv、xml、csv的屠宰版本等)。因此,我想将数据存储在数据库中,以便更容易访问、查询等 作为现在的设置,我对传感器的每次读数都使用一行(请参见下面的logu数据或log2\u数据)。当然,我想从一个日志中获取所有读数,我可以打以下电话,效果很好: SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_lo
logu数据
或log2\u数据
)。当然,我想从一个日志中获取所有读数,我可以打以下电话,效果很好:
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 7;
但是如果我想从多个文件中获取日志并将它们分开,那么以下操作将不起作用,因为它们将是一个表
从日志数据中选择utc、XPO、YPO、zpos,其中导入的日志id=7或导入的日志id=8代码>
或者更复杂(而且可能)
从日志数据中选择utc、xpos、YPO、zpos,其中导入的日志id=7;
从日志数据中选择utc、xpos、YPO、zpos,其中导入的日志id=8;
从导入的日志id=9的日志2_数据中选择utc、xvel、yvel、zvel;
从导入的日志id=10的日志2_数据中选择utc、xvel、yvel、zvel
或者,我可以打电话
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 7;
SELECT utc, xpos, ypos, zpos FROM log_data WHERE imported_log_id = 8;
SELECT utc, xvel, yvel, zvel FROM log2_data WHERE imported_log_id = 9;
SELECT utc, xvel, yvel, zvel FROM log2_data WHERE imported_log_id = 10;
并分别保存它们。这是可行的,但当日志数量变大时,速度非常慢。有什么办法可以加快速度吗?我查到的所有信息都表明,如果我需要使用阵列,那么我应该重新考虑我的设计
我试着在Postgres中将类型更改为数组类型,这非常棒。5-10倍的加速比取决于请求的记录数。问题是,我必须将所有这些从Postgres转移到SQL Server,所以我不能使用数组。非常伤心。我无法在SQLServer中获取表值参数来处理此问题
那么,如何以一种干净的方式使这些查询快速进行呢
我想到的想法,似乎都不是很好:
- 切换回Postgres(我希望)
- 将数组保存为逗号分隔的VARCHAR(8000),然后在查询时进行解析。(看起来超级胡闹,当值本身是varchars时将不起作用)
- 只需查询所有内容,然后根据导入的\u log\u id对结果集进行排序(使用python,这不会太糟糕,但似乎又错了)
我的表格如下:
-- The type of data (e.g., POS, VEL)
CREATE TABLE imported_log_type
(
imported_log_type_id INT IDENTITY(1,1) PRIMARY KEY,
imported_log_type_name VARCHAR(8000)
);
-- The raw data
CREATE TABLE imported_log
(
imported_log_id INT IDENTITY(1,1) PRIMARY KEY,
-- Type of the data
imported_log_type_id INTEGER NOT NULL REFERENCES imported_log_type(imported_log_type_id),
-- Original file name
orig_filename VARCHAR(8000) NOT NULL,
-- Blob of original data
orig_file_data VARBINARY(8000) NOT NULL
);
-- The parsed data
CREATE TABLE log_data
(
log_data_id INT IDENTITY(1,1) PRIMARY KEY,
-- Relates to a specific log. One-to-many
imported_log_id INTEGER NOT NULL REFERENCES imported_log(imported_log_id),
utc DOUBLE PRECISION,
elapsed_time DOUBLE PRECISION,
xpos DOUBLE PRECISION,
ypos DOUBLE PRECISION,
zpos DOUBLE PRECISION
)
-- The parsed data
CREATE TABLE log2_data
(
log2_data_id INT IDENTITY(1,1) PRIMARY KEY,
-- Relates to a specific log. One-to-many
imported_log_id INTEGER NOT NULL REFERENCES imported_log(imported_log_id),
utc DOUBLE PRECISION,
elapsed_time DOUBLE PRECISION,
xvel DOUBLE PRECISION,
yvel DOUBLE PRECISION,
zvel DOUBLE PRECISION
)
对于此查询:
SELECT utc, xpos, ypos, zpos
FROM log_data
WHERE imported_log_id = 7;
您需要在日志数据(导入的日志id)
上建立索引。您还可以在索引中保留其他列
考虑到加载数据的方式,可以将其作为聚集索引,这将大大提高性能
注意:您可以将这两个查询作为一个查询处理:
SELECT imported_log_id, utc, xpos, ypos, zpos
FROM log_data
WHERE imported_log_id IN (7, 8);
您在哪里查询log2\u数据
?对log2\u数据的查询是相同的。我将添加示例。