大型传感器数据的最佳选择。 Tables SQL 对比 Azure Table

Large Sensor Data best option. Tables SQL Vs Azure Table

我想要一些关于最佳选择的建议,因为我在基于 Web 的数据检索速度很慢(超过 30 秒)API。

我有多个物联网传感器(超过 100 个),它们也会将 TX 更新的传感器数据增长到我的物联网中心,然后将其保存到数据库或存储中。

以前我把我所有的传感器数据都保存到一个SQLtable,但是随着数据的增长,我发现它变得很慢,所以我使用了AzureTable存储.每个传感器都有自己的 table 存储,分区键是月份和年份(例如 202012),行键是时间戳(例如 0002518033824243332546)。

事实证明这要快得多,因为传感器数据量减少了,因为每个传感器都有自己的 table,但是随着 table 对任何特定传感器的增长,我需要在较长时间(1 个月)内检索数据,这又变得非常慢。每个传感器 TX 每 1 分钟更新一次,因此每天产生 1400 条记录,1 个月大约有 44,640 条记录。

对于我的需求有更好的解决方案吗?

每个传感器都有一个单独的 SQL table 是个好主意吗? SQL 存储中可以有多少 table?

谢谢

每个传感器都有一个单独的 SQL table 是个好主意吗? SQL 存储中可以有多少 table?

tables 可以无限制地创建,因为它只是磁盘上的一个文件。

但我认为这不是自动化的好主意。

因为您每次都必须为新传感器创建新的table。

我建议您对所有传感器只使用一个 table,并为传感器 ID 添加分区键。

创建 table 或创建分区是相同的概念,因为两者都会在磁盘上创建新的物理文件。

所以从哪个table获取和从哪个分区获取没有速度差异。

但是当你想获取两个或更多个月的数据时,你的问题仍然存在,因为它访问了多个分区(多个文件)。

对于我的需求有更好的解决方案吗?

我认为您需要 运行 批处理程序来为您的报告创建求和 table,正如@Peter Bons 评论的那样。

从昨天的求和table获取,今天从当前的table获取,合并两个数据得到结果会更快。

您可以考虑使用 Azure SQL 数据库(高级层 P6 或更高)存储来自冷路径(存储帐户)或来自需要直接保存到数据库的热路径的物联网数据.

首先考虑使用前面提到的列存储索引来优化数据存储here。有了它,您可以将数据压缩高达 20 倍,并快速将更多数据检索到内存中。

CREATE TABLE Telemetry (
    _id bigint IDENTITY,
    sensorData nvarchar(max),
   INDEX cci CLUSTERED COLUMNSTORE
)

其次可以考虑在Transact-SQL中使用In-Memory OLTP and JSON functions。有了它,您可以将格式为 JSON 的数据视为任何其他 SQL 数据类型,并从 JSON 文本中提取值以在 SELECT 中使用 JSON 数据列表或在搜索谓词中。由于基于列存储的 table 针对扫描和聚合而非键查找查询进行了优化,因此您还可以基于 JSON 函数创建计算列,这些函数随后将在原始 JSON 列,简化查询设计和开发。您可以通过在计算列上创建常规(基于行的)非聚集索引来进一步优化数据检索,以支持关键查询和访问路径。虽然这些会略微增加整体存储需求,但它们将帮助查询处理器在键查找和范围扫描时过滤行,还可以帮助进行其他操作,如聚合等。请注意,您可以随时添加计算列和相关索引。

如果您的 JSON 结构是 stable 并且预先知道,最好的选择是设计我们的关系模式以容纳来自 JSON 数据的最相关属性,并且在插入新数据时利用 OPENJSON 函数将这些属性转换为行字段。这些将是完全相关的列(具有优化的 SQL 数据类型),可用于各种检索和分析目的,从复杂的过滤到聚合,您只需要创建适当的索引来支持各种访问路径。但是,如果可能需要进一步处理,您仍然可以决定保留整个 JSON 片段并将其存储在同一 table 中的 VARCHAR(max) 字段中。

如果您可以将 IoT 数据保存为具有 SQL 数据类型的行字段,请考虑同时使用基于时间的 table 分区。将所有数据集中在一个 table 中,但按日期范围划分,如 here.

所述

一般来说,在性能方面,在写入期间聚合比在读取期间聚合更好。为数据的多个视图构建多个 table。例如,一个 table 包含过去 24 小时的原始数据,一个包含上个月每小时的汇总数据,一个包含去年每天的汇总数据。

根据您的评论:

Yes, the samples are required for averaging purpose, but firstly i need to retrieve the data first. Once we get the raw data, we average it across an hour. This is done per sensor

存储数百万原始数据只是为了将其全部读入内存并通过在内存中聚合来大大减少数据点是没有意义的。这是对存储和处理能力的浪费。

Is there any better solution for my requirement?

什么要求?我没有看到任何。无论如何,根据您提供的信息:与其使用像 sql 服务器这样的 rdbms,我建议寻找一些专门为此类数据构建的存储,例如 Azure Time Series Insight. It integrates nicely with IoT Hub

根据评论:

Has mentioned, that is best to aggregate . maybe then i could sill use Azure Tables and aggregate the data.

是的,你可以。这里也有很多选择。要聚合,您可以编写 azure function triggered by the IoT Hub that aggregates and stores the data. Or you could leverage Azure Stream Analytics to create different aggregations and send them to the desired output. Another option is to use Cosmos DB as the store for your data and use the Change Feed 来创建不同的聚合视图。

如您所见,有很多选项。哪一个最适合您的场景取决于预算、性能限制(是否也需要在全球范围内可用?)、可扩展性等。

顺便说一句,为以后的问题获得更好答案的提示:告诉我们用例。你需要这些数据有什么用?您想要什么样的查询 and/or 可视化,您想要执行什么分析?