1

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

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

4

4 回答 4

2

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

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

于 2013-03-06T15:50:18.423 回答
0

首先介绍最简单的部分。一旦您在内存中获得了来自 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... 并且一旦您导入一个月的订单,只需通过一个命令即可杀死该表(工作得很快)。

于 2013-03-07T03:32:28.063 回答
0

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

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

于 2013-03-06T16:13:04.487 回答
0

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

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

于 2013-03-06T15:53:32.377 回答