设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 创业者 手机
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-25 08:45 所属栏目:116 来源:网络整理
导读:我有一段代码执行高度非规范化表的插入.这些表的列数为~100到300.这是在 Windows Server 2008上运行的SQL Server 2008 R2. 每个插入包括在同一事务下插入多个表.有些插入是由NHibernate批处理的,但有些不可能,但它们都在同一个事务中. 当我通过重复调用执行插

我有一段代码执行高度非规范化表的插入.这些表的列数为~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

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读