SQL Server中时间序列数据的快速访问阵列

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

我有一堆日志文件,保存着来自传感器的各种速率时间序列数据(一些1Hz,一些10Hz)。数据目前分布在几个不同的文件和文件格式(csv、xml、csv的屠宰版本等)。因此,我想将数据存储在数据库中,以便更容易访问、查询等

作为现在的设置,我对传感器的每次读数都使用一行(请参见下面的
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数据的查询是相同的。我将添加示例。