为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
交互式爱情 2021-11-28 18:36:29
我正在编写一个 C# 工具,它根据用户指定的规则生成数据,并且需要将所有数据插入到数据库中的(新)表中。这些数据很容易最终变得太大而无法同时保存在内存中(甚至保存在客户端的磁盘上)。一般流程是:生成数据行插入数据表重复 1 和 2 直到满足批量大小 (??)通过SqlBulkCopy上传批量,清除DataTable重复 1-4,直到满足总行数(可能非常大)。一些注意事项:由于逻辑复杂,无法真正通过TSQL重新创建并在服务器端执行。生成较小的 DataTable 并多次上传以满足 rowcount 不是此方案的选项。每个单元格都需要在 C# 中单独设置。鉴于用户可以选择数据类型的任意组合和任意大的行数,动态确定批量大小的最佳选择是什么?
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我对这个问题的看法是拥有与 PRODUCTION 环境相似的环境,并使用不同的批次大小值进行几次测试。从性能相似的那些中选择资源利用率较低的。

动态解决方案不是一个好主意,因为您至少需要考虑网络的延迟和可用内存,这本身就是一个非常具有挑战性的问题。

希望这有帮助!


查看完整回答
反对 回复 2021-11-28
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

使批处理大小在运行时可配置,以根据性能或错误进行快速调整。您可以从每批次 10,000 行开始,然后使用以下查询来监控过去 x 分钟内成功/终止/限制的连接,并决定减少批次大小。


select *

from sys.database_connection_stats_ex

where start_time >= CAST(FLOOR(CAST(getdate() AS float)) AS DATETIME)

order by start_time desc


select * 

from sys.event_log 

where event_type <> 'connection_successful' and

start_time >= CAST(FLOOR(CAST(getdate() AS float)) AS DATETIME)

order by start_time desc

您还应该监视数据库是否达到 DTU 限制。


SELECT     

(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

如果资源低于特定阈值,还可以修改最后一个查询以增加批量大小。


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信