我正在编写一个C#工具,该工具根据用户指定的规则生成数据,并需要将所有数据插入数据库中的(新)表中。这些数据很容易变得太大,无法同时保存在内存中(甚至在客户端的磁盘上)。一般的流程是:
几个注意事项:
考虑到用户可以选择任意组合的数据类型和任意大的行数,那么动态确定批大小的最佳选择是什么?
发布于 2018-08-14 22:19:03
我对这个问题的看法是拥有一个与生产环境相似的环境,并对批处理大小的不同值进行几次测试。从性能相似的用户中选择资源利用率较低的。
动态解决方案不是一个好主意,因为您至少需要考虑网络的延迟和可用内存,这本身就是一个非常具有挑战性的问题。
希望能帮上忙!
发布于 2018-08-15 04:51:05
使批处理大小在运行时可配置,以便根据性能或错误进行快速调整。您可以从每批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如果资源低于特定阈值,还可以修改最后一个查询以增加批处理大小。
https://stackoverflow.com/questions/51850124
复制相似问题