3

我一直在阅读如何对 Azure 表存储进行分区以确保高性能。我想知道我提出的策略是否能够为数据存储提供高效且可扩展的插入和简单查询。

我有 1000 个不同的进程每 30 秒将一小包数据(约 50 字节)上传到 AZT。我的查询几乎总是按流程和时间进行简单查询。例如,我想查询给定日期从晚上 7 点到晚上 9 点的所有进程 A 的日志。

我提出的策略是为每个进程创建一个表(1000 个表),然后对行进行分区,使每个分区包含 6 小时的数据(每天 4 个新分区,每个分区 720 行)。从 11 月 8 日午夜到早上 6 点,分区键“NOV82012-0”将包含 720 行。'NOV82012-1' 将包含 6AM-Noon 等...

这应该确保我在任何分区中的行数始终少于 1000 行,这样我就不必担心延续令牌。我也可以轻松地按进程“过滤”,因为每个进程的数据都有自己的表。

这是这种情况下的理想策略吗?我错过了什么吗?

4

2 回答 2

2

实际上,如果您使用的是 .NET SDK,则无需担心延续令牌。通过对查询调用AsTableServiceQuery(),您将获得一个自动处理延续令牌的对象。

根据您所说的,您想根据一些条件进行过滤:

  • 过程
  • 日期
  • 时间

我真的认为不需要为每个进程创建 1 个表。您可以使用组合键对其进行分区:Process+Date。一个例子:

  • A_20121108
  • A_20121109
  • B_20121108

通过将流程名称与日期结合起来,您可以坚持使用单个表格,只是为了让事情变得更容易。现在关于行,每个分区有 1000 多个项目是可以的。将给定日期的所有行都放在同一个分区中的好处是,您可以根据行键轻松选择该分区中的范围(这是半伪代码,没有测试它 - 您可能想要改进行键)。

from item in context.CreateQuery<XXX>("XXX") 
where item.PartitionKey == "A_20121108" && item.RowKey.CompareTo("20121108120000") >= 0 && item.RowKey.CompareTo("20121108193000") <= 0
select item;
于 2012-11-08T21:48:12.793 回答
1

我同意 Sandrino 的建议,即为所有流程使用一张表。

ATS 做得不太好的一件事是支持删除。考虑到这一点,我建议在表级别按时间范围进行分区。这样,您可以在不需要该时间范围内的数据时删除该表。

一个键控结构可以是

表名 = 前缀 + YYYYMM(年和月)
示例 Process201211

PKey = Process + DDHHMM(日期、小时和分钟)
示例 A081834、B122359 等

RKey = 秒或亚秒。
如果您不能保证亚秒级的唯一性,请考虑附加 GUID

于 2012-11-09T02:17:21.650 回答