none
SQL SERVER 2008 R2 插入数据非常慢 RRS feed

  • 问题

  • 技术问题描述: 大批量插入数据速度过慢,66万条数据耗时1小时34分钟
                
    问题出现环境(软件/硬件):
    操作系统: Windows 2008 R2 64位

    数据库:sql server 2008 R2 标准版 64位

    intel Xeon CPU E5-2603 v3 @1.6GHz 六核心

    32G内存

    表是5字段int类型,第一个字段是主健,自增字段

    表结构:

    id int Unchecked
    billno bigint Unchecked
    opid int Checked
    billopid int Checked
    tag int Checked

    存储过程:

    CREATE proc [dbo].[inbill]
    @bills bigint,
    @bille bigint,
    @billopid int,
    @result int output,
    @incount int output
    as
    begin
      set @result = (select COUNT(*) from bill where billno >= @bills and billno<=@bille)
      set @incount = 0
      if @result = 0 
      begin
        while @bills + @incount <= @bille 
        begin
          insert into bill (billno,billopid) values (@bills + @incount,@billopid)
          set @incount = @incount + 1
        end
      end
    end


    2017年5月17日 8:17

全部回复

  • 你每次插入,都会让服务器和客户端交互一次,所以很慢。设置set nocount on可以加快。如果想要更快,可以改成批量的插入,比如使用表变量做中间存储。


    想不想时已是想,不如不想都不想。

    • 已建议为答案 sxlaozhang 2017年6月5日 6:40
    2017年5月17日 8:43
    版主
  • 跟踪下看看慢在哪里,关注下IO是否有瓶颈

    另外批量写入包含在一个事务里面会提高性能

    2017年5月17日 9:21
  • SQL Profiler trace一下,这几句代码看不出问题,理论上是几分钟就可以完成的。

    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年5月17日 9:45
  • 客户端只是提供了一个起止号码,由存储过程插入,不是每条都交互
    2017年5月18日 1:34
  • 硬件没问题,IO没有瓶颈
    2017年5月18日 1:34
  •   set @result = (select COUNT(*) from bill where billno >= @bills and billno<=@bille)

    --------------------------- 这个有索引? 有检查过个的效率?

    后面还有个     while @bills + @incount <= @bille 

    有计算过这个循环一次操作会进行多少次?

    2017年5月18日 1:58
  • 客户端只是提供了一个起止号码,由存储过程插入,不是每条都交互

    你不加set nocount on,就是每次insert都会发一个消息到客户端去。

    想不想时已是想,不如不想都不想。

    2017年5月18日 5:17
    版主
  • 硬件没问题,IO没有瓶颈

    你怎么知道IO没瓶颈的?日志写很可能是一个瓶颈。看IO不能光看IOPs和throughput


    想不想时已是想,不如不想都不想。

    2017年5月18日 5:20
    版主
  • 同样的方法,在普通PC上,插入66万条只用一分钟
    2017年5月18日 6:26
  • 同样的方法,在普通PC上,插入66万条只用一分钟
    很正常啊,第一,PC上直接执行,每次insert的交互网络开销很小。第二,PC的存储的单线程小块写入速度,比SAN, NAS都要快。

    想不想时已是想,不如不想都不想。

    2017年5月18日 9:53
    版主
  • 两个改善点:

    1、如果每次会插入数十、百甚至更多,那么显式启用事务效率会提高

    2、更应该建立个序列辅助表,做个关联一次性就插入需要的N条记录


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    2017年6月4日 4:52
  • profile 跟踪一下感谢信过程内语句的执行(SP:StmtCompleted 事件),看看具体哪条语句慢

    另外,在执行过程中,你可以查下进程,看盾status, wait_type 和 waitresource, 这个能够帮助确认是哪方面的问题

    select * from sysprocesses where spid >0 and status<>'sleeping'

    2017年6月7日 2:00