清除/复制Azure存储表数据到SQL Azure的最快方法



我有这些聚合传入数据并将总数存储在Azure存储表中的工作者角色。我需要这些数据被清除/复制(在指定的间隔)到SQL Server报告。我要在一批中清除大约1000行。使用select/insert/update的简单循环需要很长时间。

有什么最有效的方法吗?谢谢!

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

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

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

如何备份我的Windows Azure表存储?

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

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

先介绍最简单的部分。一旦你有数据从ATS在内存中,你可以使用SqlBulkCopy插入大量的行到SQL服务器非常快(它的工作原理像BCP,但从。net)。

现在,最困难的部分是快速从ATS获取数据。我对你的Pkey/Rkey模式一无所知。然而,有几件事需要考虑:

1)使用单个PartitionKey和rowkey范围对ATS执行查询是最快的。如果您的查询不包含RowKey上的条件,即使您的行数少于1000并且指定了PartitionKey

,您也可能会遇到延续令牌。

2)如果你需要从ATS获取大量数据,并且可以将工作拆分为一堆独立且性能良好的查询,请考虑将查询分发到队列消息中,然后让多个处理器并行地单独处理每个查询

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

最新更新