【问题标题】:What is the best way of creating Partition key in azure table storage for storing sensor output data?在 Azure 表存储中创建分区键以存储传感器输出数据的最佳方法是什么?
【发布时间】:2017-06-30 07:14:32
【问题描述】:

我搜索了将传感器输出数据存储在 azure 表存储中的最佳做法,但没有得到最佳答案。我目前正在开展一个项目,该项目包括将传感器数据存储到 azure 表存储。目前我使用分区键作为 Sensor ID 。每一秒我都在存储传感器输出。目前正在使用大约 100 个传感器。因此,想象一下每天都在存储大量数据。因此,当我按日期搜索特定传感器数据时,我的 Web 应用程序的性能变得很慢。有没有更好的方法来提高 Web 应用程序的性能?如何将传感器 ID 更改为日期作为分区键?代码在这里并不重要。我需要一个合乎逻辑的解决方案.. 可能这个问题会帮助很多正在处理这种情况的开发人员..

更新

每个传感器提供 10 个不同的输出和日期,即输出日期时间。因此它们位于每个传感器 ID 的同一行中。我正在使用日期范围和传感器 ID 获取传感器数据

分区键-传感器ID、RowKey-日期时间、10个输出列和输出日期

这是我的代码

var query = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sensorID);
var dateFilter = TableQuery.CombineFilters(
            TableQuery.GenerateFilterConditionForDate("outputdate", QueryComparisons.GreaterThanOrEqual, Convert.ToDateTime(from)),
            TableOperators.And,
            TableQuery.GenerateFilterConditionForDate("outputdate", QueryComparisons.LessThanOrEqual, Convert.ToDateTime(to))
            );
            query = TableQuery.CombineFilters(query, TableOperators.And, dateFilter);
var rangeQuery = new TableQuery<TotalizerTableEntity>().Where(query);

        var entitys = table.ExecuteQuery(rangeQuery).OrderBy(j => j.date).ToList();

outputdate 表示输出生成时间。这是日期时间。所有输出都有相同的输出时间。

【问题讨论】:

  • 请用以下内容更新您的问题:1) 选择 PartitionKeyRowKey 的当前设计是什么,即表中存储的当前值是什么以及 2) 你打算如何查询数据?请列出所有可能的查询场景。谢谢!
  • 你使用什么行键?
  • 行键是日期时间
  • SHADOWS....请使用所有详细信息更新您的问题,而不是将它们作为 cmets。
  • 感谢您更新问题。但是它仍然不包括我要求的东西。您是否将传感器 ID 存储为 PartitionKey?当您获得输出(您提到的 10 个)时,它们是否都具有相同的日期/时间?您还没有回答您打算如何查询这些数据?是按传感器 ID 和日期/时间范围还是仅按日期/时间范围?请不要害羞,并提供尽可能多的细节:)。这将有助于我们为您提供一些替代方案。

标签: azure azure-table-storage


【解决方案1】:

首先,我强烈建议您阅读Azure Storage Table Design Guide: Designing Scalable and Performant Tables。这将为您提供很多关于如何构建数据的想法。

现在介绍您当前的实现。我注意到的是,您在查询中包含了PartitionKey(顺便说一句,这非常好),但随后也在查询中添加了一个非索引属性(outputdate)。这将产生已知的Partition Scan。对于较大的表,这会产生问题,因为您的查询将扫描整个分区以查找匹配的outputdate 属性。

您提到您存储的datetime 值是RowKey。假设 RowKey 值与 output 日期的值匹配,我建议在您的查询中使用 RowKey 而不是这个非索引属性。 RowKey(连同PartitionKey)是表中仅有的两个被索引的属性,因此查询会相对快得多。

当将日期/时间保存为 RowKey 时,我建议将其转换为刻度 (DateTime.Ticks),然后将其保存,而不是简单地将日期/时间值转换为字符串。如果您要采用这种方法,我建议您在此刻度前添加 0,以便所有值的长度相同(执行类似 DateTime.Ticks.ToString("d19") 的操作)。

您还可以将RowKey 保存为Reverse Ticks,即(DateTime.MaxValue.Ticks - DateTime.Ticks).ToString("d20")。这将确保所有最新条目都被添加到表格的顶部而不是底部。这将在您对查询最新记录更感兴趣的情况下有所帮助。

如果您总是查询特定传感器,则将每个传感器的数据保存在单独的表中可能不会有什么坏处,即每个传感器都有一个单独的表。这将为您腾出一把钥匙。您可以将日期/时间值(您当前存储为RowKey)用作PartitionKey,也可以将其他值用作RowKey。此外,它还允许您跨存储帐户进行扩展——某些传感器的数据将进入一个存储帐户,而其他传感器的数据将进入另一个存储帐户。您只需要在某个地方保存此关系,以便数据到达正确的存储帐户/表。

【讨论】:

  • 感谢您提供很好的解释。在当前上下文中,我必须将所有传感器数据存储在一个表中。我不能使用 RowKey,因为输出日期时间和 RowKey 瞬间可能不同。
猜你喜欢
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2017-03-26
  • 2021-06-30
相关资源
最近更新 更多