首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将批量生成的数据上载到Server如何确定批处理大小?

将批量生成的数据上载到Server如何确定批处理大小?
EN

Stack Overflow用户
提问于 2018-08-14 21:38:34
回答 2查看 382关注 0票数 0

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

  1. 生成数据行
  2. 插入DataTable
  3. 重复1和2直到批次大小(?)相逢
  4. 通过SqlBulkCopy上传批处理,清除DataTable
  5. 重复1-4,直到达到总行数(可能非常大)为止。

几个注意事项:

  • 由于逻辑的复杂性,不能真正通过TSQL和执行服务器端重新创建它。
  • 生成一个较小的DataTable并多次上传以满足行计数并不是此场景的一个选项。每个单元需要在C#中单独设置。

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

EN

回答 2

Stack Overflow用户

发布于 2018-08-14 22:19:03

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

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

希望能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2018-08-15 04:51:05

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

代码语言:javascript
复制
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限制。

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51850124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档