每个插入包括在同一事务下插入多个表.有些插入是由NHibernate批处理的,但有些不可能,但它们都在同一个事务中.
当我通过重复调用执行插入的代码执行500次插入时,平均得到~360 ms.
奇怪的是,当我使用4个进程同时运行测试代码时(在Windows Server 2008下从4个不同的命令提示运行相同的exe),每个调用的插入性能变得更好.我看到突发的速度可以达到90毫秒(几乎快了X4).我正在从代码中测量插入时间.
由于4个进程对彼此一无所知,我假设这与sql Server有关,但我完全不知道为什么.我想知道为什么会发生这种情况,如果有任何配置可以让我在插入不频繁时获得相同的性能.
解决方法
要确定事务日志吞吐量/刷新大小是否是一个因素,请监视:
> sys.dm_os_wait_stats用于WRITELOG和LOGBUFFER等待@H_404_19@> sys.dm_io_pending_io_requests用于IO性能@H_404_19@>性能监视器计数器(或sys.dm_os_performance_counters):
> Log Bytes Flushed / sec@H_404_19@>记录刷新/秒@H_404_19@>日志刷新等待时间
寻找达到的内部限制.在sql Server 2008 R2中,64位版本上每个数据库最多可以有32个未完成(异步)日志刷新I / O(32位只有8个).未完成的IO数量限制为3840KB.
更多信息和进一步阅读:
> Transaction Log Monitoring@H_404_19@> Trimming Transaction Log Fat@H_404_19@> Diagnosing Transaction Log Performance Issues and Limits of the Log Manager@H_404_19@> Optimizing Transaction Log Throughout