如何将DataAdapter.UpdateBatchSize设置为"最佳"值?

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问题和即将插入的数据,是否应该可以计算或至少猜测一个好的值?

有没有人可以推荐的最佳实践?

Ric*_*kNZ 7

您可以通过查看SQL事件探查器或通过调用来查看批处理的效果SqlConnection.RetrieveStatistics().您应该看到的是,每个批次对应于DB的单次往返.

至于如何优化批量大小,一个非常粗略的经验法则是,当批量大小超过50时,性能趋于停止改善 - 实际上,有时较大的批次比较小的批次运行得慢.如果我太忙而无法测试,我通常会从大约20个批处理开始(除非我使用表值参数,批量最多500个可以比较小的批次更快).但是,最佳数量取决于插件的总大小(它们是否都适合RAM),数据库日志所在磁盘的速度,日志是否位于其自身的驱动器/ LUN上(如果不是那么大的成本,等等.

可实现的速度通常首先受到往返次数的限制,然后是事务大小,然后记录磁盘速度(特别是是否可以顺序访问,或者由于与同一轴上的其他文件竞争而被迫随机),最后内存.但是,所有因素在某种程度上也相互关联.

提高插入性能的第一步是在事务中执行它们 - 可能每批次或两次交易.除此之外,表值参数可能是下一步,使用存储过程INSERT INTO Table SELECT column FROM @TableArgument.