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