sql-server – 在负载下插入性能增加:为什么?

前端之家收集整理的这篇文章主要介绍了sql-server – 在负载下插入性能增加:为什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一段代码执行高度非规范化表的插入.这些表的列数为~100到300.这是在 Windows Server 2008上运行的sql Server 2008 R2.

每个插入包括在同一事务下插入多个表.有些插入是由NHibernate批处理的,但有些不可能,但它们都在同一个事务中.

当我通过重复调用执行插入的代码执行500次插入时,平均得到~360 ms.

奇怪的是,当我使用4个进程同时运行测试代码时(在Windows Server 2008下从4个不同的命令提示运行相同的exe),每个调用的插入性能变得更好.我看到突发的速度可以达到90毫秒(几乎快了X4).我正在从代码中测量插入时间.

由于4个进程对彼此一无所知,我假设这与sql Server有关,但我完全不知道为什么.我想知道为什么会发生这种情况,如果有任何配置可以让我在插入不频繁时获得相同的性能.

有关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

猜你在找的MsSQL相关文章