将Azure存储表数据清除/复制到SQL Azure的最快方法是什么?

时间:2013-03-06 15:08:35

标签: azure azure-sql-database azure-table-storage

我有这些工作者角色聚合传入数据并将总计存储在Azure存储表中。我需要将此数据清除/复制(按指定的时间间隔)到SQL Server进行报告。我正在批量清洗大约1000行。选择/插入/更新的简单循环将需要很长时间。

任何想法如何最有效地做到这一点?谢谢!

4 个答案:

答案 0 :(得分:2)

是否所有数据都在明确定义的分区中?例如,分区键中的1000个实体" A"和分区键中的1000" B"。如果是这样,那么您应该能够从特定分区中选择所有记录。根据记录的数量,您可能必须处理延续令牌(您只能获得每个请求的最大数量并使用延续令牌来获取剩余记录)。

使用分区键也可以是更新批处理(在事务中)的好方法。

答案 1 :(得分:0)

您可以尝试在本地下载所有数据,然后将它们插入SQL。

How can I back up my Windows Azure table storage?

答案 2 :(得分:0)

我在一个多月前寻找类似的解决方案,并发现最快的方法是使用我自己的代码 - 分批读取表存储并插入到sql中。有一点有用的是在sql导入表中临时记录PartitionKey + RowKey,这样当导入失败时我可以安全地从上一个成功位置重新启动它。

RedGate和其他人有一些工具允许你从表存储中检索所有数据,但据我所知 - 他们将它转储到文件 - 而不是SQL。

答案 3 :(得分:0)

首先覆盖最简单的部分。一旦你从内存中的ATS获得数据,你可以使用SqlBulkCopy非常快速地将很多行插入SQL服务器(它的工作方式类似于BCP,但是来自.NET)。

现在,最难的部分是快速从ATS获取数据。我对你的Pkey / Rkey架构一无所知。但是,有几点需要考虑:

1)使用单个PartitionKey和RowKeys范围对ATS执行查询是最快的。如果您的查询在RowKey上不包含条件,即使您的行少于1000行且指定了PartitionKey,也可以使用延续令牌命中

2)如果您需要从ATS获取TON数据并且可以将工作拆分为一堆单独且执行良好的查询,请考虑将查询分发到队列消息中,然后让多个处理器在paralelle中单独处理每个查询< / p>

3)清洗可能很有趣。您可以使用批处理事务一次清除100个实体,因此,如果您的单个查询允许它,在将数据处理到sql server之后,您可以使用相同的内存中实体并按每个分区键清除它们100(这将适度快速)。或者,如果可以,您可以将表拆分为按某个日期或其他键分区的多个表,并通过一次删除表来删除数据。例如,如果您有一个需要移动到SQL的大型Orders表,而不是只有一个Orders表,则创建每月Orders表:Orders201301..thru..Orders2xxx_12 ...并且一旦导入一个月的订单,只需通过一个命令杀死该表(快速工作)。