我在Azure SQL数据库上使用Microsoft Sync-Framework 2.1。我正在为同步预配的表有大约 1M 条记录。创建同步范围时,同步框架会创建一个XXX_tracking表,每个原始记录一行。在 Azure 上创建此表非常慢。 正在执行的查询如下所示:
INSERT INTO [Transactions_tracking]
([Id], [create_scope_local_id], [local_create_peer_key], [local_create_peer_timestamp], [update_scope_local_id], [local_update_peer_key]
, [sync_row_is_tombstone], [PointOfSaleId], [ExecutedTime])
SELECT [base].[Id], NULL, 0, @@DBTS+1, NULL, 0, 0, [base].[PointOfSaleId], [base].[ExecutedTime]
FROM [Transactions] [base] LEFT OUTER JOIN [Transactions_tracking] [side] ON [base].[Id] = [side].[Id] WHERE [side].[Id] IS NULL;
在SQL Express上,这需要19秒,而在具有50个DTU的Azure上,这需要619秒,我真的无法解释。
有什么想法吗? 谢谢特拉维斯
可能是大容量加载进程达到了 DTU 限制,并且正在发生限制。高级层适用于 I/O 密集型工作负荷,可以在这些类型的工作负荷运行之前纵向扩展到高级层,并在这些工作负荷不再存在时缩减到原始层。
高级层如何为 IO 操作和事务提供更好的性能的一个示例是将标准 S1 与高级 P2 进行比较。标准 S1 的插入限制为每分钟 1.4 MB,而高级 P2 的插入限制为每分钟 13.5 MB。
有时可以使用"等待延迟"语句来限制自己的进程,但仅当问题是插入的突发暂时超过 DTU 限制时,才会这样做。 如果数据一次超过 DTU 限制数小时,则只需要更多 DTU。
此处的 Azure 文档还讨论了使用批处理来提高插入性能的重要性。