Fre*_*lin 7 performance ado.net updatebatchsize
我终于让我的插件批次工作了,现在我一直在摆弄批量的大小,但是我看不到值50和值10000之间的性能差异.这似乎很奇怪我,但我不知道幕后发生了什么,所以这可能是正常行为.
我在表中插入160k行,测试值的平均时间为115 +/- 2秒.没有批处理需要210秒,所以我对改进非常满意.目标表是:
CREATE TABLE [dbo].[p_DataIdeas](
[wave] [int] NOT NULL,
[idnumber] [int] NOT NULL,
[ideaID] [int] NOT NULL,
[haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen] DEFAULT ((0)),
CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED
(
[wave] ASC,
[idnumber] ASC,
[ideaID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我在设置UpdateBatchSize时阅读了要查找的内容,答案是简单地测试几个不同的值.我能理解这一点,但如果您知道表格设计,SQL问题和即将插入的数据,是否应该可以计算或至少猜测一个好的值?
有没有人可以推荐的最佳实践?
您可以通过查看SQL事件探查器或通过调用来查看批处理的效果SqlConnection.RetrieveStatistics().您应该看到的是,每个批次对应于DB的单次往返.
至于如何优化批量大小,一个非常粗略的经验法则是,当批量大小超过50时,性能趋于停止改善 - 实际上,有时较大的批次比较小的批次运行得慢.如果我太忙而无法测试,我通常会从大约20个批处理开始(除非我使用表值参数,批量最多500个可以比较小的批次更快).但是,最佳数量取决于插件的总大小(它们是否都适合RAM),数据库日志所在磁盘的速度,日志是否位于其自身的驱动器/ LUN上(如果不是那么大的成本,等等.
可实现的速度通常首先受到往返次数的限制,然后是事务大小,然后记录磁盘速度(特别是是否可以顺序访问,或者由于与同一轴上的其他文件竞争而被迫随机),最后内存.但是,所有因素在某种程度上也相互关联.
提高插入性能的第一步是在事务中执行它们 - 可能每批次或两次交易.除此之外,表值参数可能是下一步,使用存储过程INSERT INTO Table SELECT column FROM @TableArgument.
| 归档时间: |
|
| 查看次数: |
4595 次 |
| 最近记录: |