将批量生成的数据上传到 SQL Server - 如何确定批量大小?

我正在编写一个 C# 工具,它根据用户指定的规则生成数据,并且需要将所有数据插入到数据库中的(新)表中。这些数据很容易最终变得太大而无法同时保存在内存中(甚至保存在客户端的磁盘上)。一般流程是:

  1. 生成数据行

  2. 插入数据表

  3. 重复 1 和 2 直到满足批量大小 (??)

  4. 通过SqlBulkCopy上传批量,清除DataTable

  5. 重复 1-4,直到满足总行数(可能非常大)。

一些注意事项:

  • 由于逻辑复杂,无法真正通过TSQL重新创建并在服务器端执行。

  • 生成较小的 DataTable 并多次上传以满足 rowcount 不是此方案的选项。每个单元格都需要在 C# 中单独设置。

鉴于用户可以选择数据类型的任意组合和任意大的行数,动态确定批量大小的最佳选择是什么?


交互式爱情
浏览 190回答 2
2回答

繁华开满天机

我对这个问题的看法是拥有与 PRODUCTION 环境相似的环境,并使用不同的批次大小值进行几次测试。从性能相似的那些中选择资源利用率较低的。动态解决方案不是一个好主意,因为您至少需要考虑网络的延迟和可用内存,这本身就是一个非常具有挑战性的问题。希望这有帮助!

幕布斯6054654

使批处理大小在运行时可配置,以根据性能或错误进行快速调整。您可以从每批次 10,000 行开始,然后使用以下查询来监控过去 x 分钟内成功/终止/限制的连接,并决定减少批次大小。select *from sys.database_connection_stats_exwhere start_time >= CAST(FLOOR(CAST(getdate() AS float)) AS DATETIME)order by start_time descselect *&nbsp;from sys.event_log&nbsp;where event_type <> 'connection_successful' andstart_time >= CAST(FLOOR(CAST(getdate() AS float)) AS DATETIME)order by start_time desc您还应该监视数据库是否达到 DTU 限制。SELECT&nbsp; &nbsp; &nbsp;(COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent',(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent',(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'FROM sys.dm_db_resource_stats如果资源低于特定阈值,还可以修改最后一个查询以增加批量大小。
打开App,查看更多内容
随时随地看视频慕课网APP