我有这些工作角色聚合传入数据并将总数存储在 Azure 存储表中。我需要将此数据清除/复制(在指定的时间间隔内)到 SQL Server 以进行报告。我正在批量清除大约 1000 行。带有选择/插入/更新的简单循环将需要很长时间。
任何想法如何最有效地做到这一点?谢谢!
我有这些工作角色聚合传入数据并将总数存储在 Azure 存储表中。我需要将此数据清除/复制(在指定的时间间隔内)到 SQL Server 以进行报告。我正在批量清除大约 1000 行。带有选择/插入/更新的简单循环将需要很长时间。
任何想法如何最有效地做到这一点?谢谢!
是否所有数据都在定义明确的分区中?例如,分区键“A”中有 1000 个实体,分区键“B”中有 1000 个实体。如果是这样,那么您应该能够从特定分区中选择所有记录。根据记录的数量,您可能必须处理延续令牌(您只能获取每个请求的最大数量并使用延续令牌来获取剩余的记录)。
使用分区键也可能是更新批次(在事务中)的好方法。
首先介绍最简单的部分。一旦您在内存中获得了来自 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... 并且一旦您导入一个月的订单,只需通过一个命令即可杀死该表(工作得很快)。
一个多月前我一直在寻找类似的解决方案,发现最快的方法是使用我自己的代码——从表存储中批量读取并插入到 sql。有用的一件事是在 sql 导入表中临时记录 PartitionKey + RowKey,这样当我的导入失败时,我可以安全地从上次成功的位置重新启动它。
RedGate 和其他人有一些工具允许您从表存储中检索所有数据,但据我所知 - 他们将其转储到文件中 - 而不是 SQL。
您可以尝试在本地下载所有数据,然后将它们插入 SQL。