我有个表,大概有35个字段,要一秒钟插入>2000行数据?有没有可行性?请大虾给个提示?  我已经用了存储过程进行存储!

解决方案 »

  1.   

    你用的是什么数据库? 如果不是数据库本身存在存储的瓶颈,那就是你的机器插入得太慢了,换多CPU或者更高级的CPU电脑试试..
      

  2.   

    数据库是 SQL2000  ,这个忘记说了  ,cpu: 2.8,内存1G
      

  3.   

    换多CPU电脑试试,然后用多线程同时写库.. 或者用不同的几台电脑同时写...
      

  4.   

    你首先要知道瓶颈在哪?? 是数据库本身一秒不能接受> 2000行的数据写入,还是数据库没问题,而是你写入的电脑达不到每秒发出> 2000行数据写入请求的要求?? 如果是数据库的瓶颈,那没办法,如果是你电脑的问题,那提升你电脑的写入速度,单线程速度肯定不能提升了,你只能测试多CPU多线程,或者多电脑同时写~~
      

  5.   

    三种方法
    1.recordset addnew() updatebatch()
    2.存储过程
    3.批量导入
    1,添加记录集速度很快,最后update相当于发送多条sql,速度不会快于10楼
    2,存储过程,个人理解:相当于已经准备好了存储过程,一次解析终生适用,速度不会快于10楼
    3,只有这个,有可能超过10楼,毕竟insert 100次和insert 100条记录一次速度不同吧
      

  6.   

    直接Select 出来数据,要用到的,正在测试
      

  7.   

    强烈建议!!
    用记录集open,获得该表的数据
    然后反复用filter过滤记录集避免频繁访问数据库
      

  8.   

    表一般是不会变化的, shakaqrj  方法没有试过, 不过每调用一次存储过程都要去打开记录集过滤是不是也很慢!
      

  9.   

    不,既然这张表基本不变
    那就只open一次,在循环外面filter在循环内用来过滤
    相当于把整个表放到了内存中
    在内存中查找当然比那样快
      

  10.   

    数据很频繁的话,是否可以考虑自己在中间设计一层Cache,数据都插入到这个cache中,当cache满了之后再写入数据库
      

  11.   

    你的sp里面,如果判断很多,操作很多,当然会影响你的性能的…………所以,我感觉你的问题基本无解了你再试试你的sp(包含那些逻辑,判断阿什么)在查询分析器里跑的速度…………你在20楼回复说,你一秒可以插4000条,是不是指光光插入(insert)的时间不包括任何逻辑的处理??如果加上你的逻辑处理,包括从别的表里去取数据,那么你的sp要多少时间跑完??感觉这个问题基本和vc没什么关系了,你要做的就是优化你的sp,优化你的查询阿什么的但是有时候优化也是有限的…………你的逻辑摆在这里,决定了,你不可能提高更多的performance.........
      

  12.   

    另外,如果你的插入是要从别的表里去取数据的话那么以后,你这个sp花费的时间将越来越慢因为随着时间的推移,你数据库里的记录会越来越多那么相应查询所消耗的时间也会增长,所以…………有可能你今天能1秒2000条,到一个月以后,就到不了这种performance了
      

  13.   

    非常感谢 handsomerun  (毛毛) 和shakaqrj 等  ,我在测试一下各个条件下的每秒插入量
      

  14.   

    搂住 既然知道了再没有别的逻辑判断的情况下,可以达到2000条/s,那么你的数据库速度是可以跟上的,问题就在你的逻辑sp上,你应该优化一些a。
      

  15.   

    最大的瓶颈应该是磁盘I/0操作,无论你多快的CPU,多大的内存,N多的线程,磁盘忙不过来就是忙不过来。
      

  16.   

    CREATE PROCEDURE  G00_001_001_001@RType varchar(50),  
     @STIME varchar(50), 
    @SLat varchar(50),  
    @SLon varchar(50),
    @SDirection varchar(50),
    @SWeek varchar(50),
    @SSpeed varchar(50),
    @SHei varchar(50),
    @SFlags varchar(50),
    @SS varchar(50),
    @AFlags varchar(50),
    @SA varchar(50),
    @FTID varchar(50),
    @GisNum varchar(50),  @SREV varchar(50),
    @FNUM varchar(50),
    @FDATA varchar(50)  
    as
     set nocount ON 
    DECLARE @Terminal_Num varchar(50)DECLARE @F_ID varchar(50)
    DECLARE @F_TName varchar(50)
    DECLARE @F_Terminal_Name varchar(50)
    DECLARE @F_TDW      varchar(50)
    DECLARE @F_Company_Name      varchar(50)
    DECLARE @F_vclen varchar(50)  
    DECLARE @F_Car_Type_Name varchar(50)
    DECLARE @F_Ter_Car_No       varchar(50)
    DECLARE @F_OIL      varchar(50)
    --
    DECLARE @F_Driver_Name      varchar(50)  
    DECLARE @F_Work_Num varchar(50)
    DECLARE @F_DIS      varchar(50)
    DECLARE @F_TEMP      varchar(50)
    DECLARE @F_WorkID varchar(50)
    DECLARE @F_SURESTATE      varchar(50)
    DECLARE @S_STATE varchar(50) DECLARE @RowInfo  varchar(2048)
    DECLARE @Content varchar(2048)
    DECLARE @RUN_EXEC varchar(4056)
    set  @RowInfo =''
    set  @Content=''--下面是判断的,都是检测条件是否为空,如果为空的话,就默认为NULL 否则输入值
    if @FTID <>''
    begin
    set @RowInfo = @RowInfo+'F_TID,'
    set @Content =@Content+@FTID+','
    end
     
    if @GisNum <>''
    begin
    set @RowInfo = @RowInfo+'F_TGSM'
    set @Content =@Content+@GisNum
    end
     
    if @RType <>''
    begin
    set @RowInfo = @RowInfo+',  R_Type'
    set @Content =@Content+','+CHAR(39)+ @RType+CHAR(39)
    end
      
     if @STIME <>''
    begin
    set @RowInfo = @RowInfo+', S_TIME'
    set @Content =@Content+','+@STIME
    end
     
     
    if @SLat  <>''
    begin
    set @RowInfo = @RowInfo+', S_Lat'
    set @Content =@Content+','+@SLat 
    end
     if @SLon <>''
    begin
    set @RowInfo = @RowInfo+', S_Lon'
    set @Content =@Content+','+@SLon
    end
     if @SDirection  <>''
    begin
    set @RowInfo = @RowInfo+', S_Direction'
    set @Content =@Content+','+ @SDirection
    end
     
    if @SWeek <>''
    begin
    set @RowInfo = @RowInfo+', S_Week'
    set @Content =@Content+','+@SWeek
    end
     if @SSpeed <>''
    begin
    set @RowInfo = @RowInfo+', S_Speed'
    set @Content =@Content+','+@SSpeed 
    end
     if @SHei <>''
    begin
    set @RowInfo = @RowInfo+', S_Hei'
    set @Content =@Content+','+@SHei
    end
     if @SFlags <>''
    begin
    set @RowInfo = @RowInfo+', F_S_Flags'
    set @Content =@Content+','+ @SFlags
    end
     if @SS <>''
    begin
    set @RowInfo = @RowInfo+' , S_S'
    set @Content =@Content+','+@SS
    end
     if @AFlags <>''
    begin
    set @RowInfo = @RowInfo+', F_A_Flags'
    set @Content =@Content+','+ @AFlags
    end
     
    if @SA  <>''
    begin
    set @RowInfo = @RowInfo+', S_A'
    set @Content =@Content+','+@SA
    end
     if @SREV  <>''
    begin
    set @RowInfo = @RowInfo+', S_REV'
    set @Content =@Content+','+@SREV
    end
     if @FNUM <>''
    begin
    set @RowInfo = @RowInfo+', F_NUM'
    set @Content =@Content+','+CHAR(39)+ @FNUM+CHAR(39)
    end
     
    select  @F_Ter_Car_No = F_Car_Number,@F_OIL =F_Car_Oil, @F_vclen =F_Car_Type_ID,@F_TDW = F_Company_ID  ,@F_Car_Type_Name= F_Car_Type  ,@F_Company_Name=  F_Company_Name, @F_ID= F_Terminal_ID ,@Terminal_Num=F_Terminal_Num,  @F_TName=F_Terminal_Type_ID,@F_Terminal_Name  = F_Terminal_Factory   from  Car_Static_Info where   F_Terminal_SIM_Num= @GisNumif @F_ID <>''
    begin
    set @RowInfo = @RowInfo+', F_ID'
    set @Content =@Content+','+@F_ID
    end
     
    if @F_TName <>''
    begin
    set @RowInfo = @RowInfo+', F_TName'
    set @Content =@Content+','+@F_TName 
    end
     
    if @F_Terminal_Name <>''
    begin
    set @RowInfo = @RowInfo+', F_Terminal_Factory_Name'
    set @Content =@Content+','+CHAR(39)+@F_Terminal_Name+CHAR(39) 
    end
    if @F_Company_Name <>''
    begin
    set @RowInfo = @RowInfo+', F_Company_Name'
    set @Content =@Content+','+CHAR(39)+@F_Company_Name+CHAR(39)
    endif @F_Car_Type_Name <>''
    begin
    set @RowInfo = @RowInfo+', F_Car_Type_Name'
    set @Content =@Content+','+CHAR(39)+@F_Car_Type_Name+CHAR(39)
    endif @F_TDW <>''
    begin
    set @RowInfo = @RowInfo+', F_TDW'
    set @Content =@Content+','+@F_TDW
    end
     
    if @F_vclen  <>''begin
    set @RowInfo = @RowInfo+', F_vclen'
    set @Content =@Content+','+@F_vclen
    end
     if @F_Ter_Car_No  <>''
    begin
    set @RowInfo = @RowInfo+', F_Ter_Car_No'
    set @Content =@Content+','+@F_Ter_Car_No
    end
     if @F_OIL  <>''
    begin
    set @RowInfo = @RowInfo+', F_OIL'
    set @Content =@Content+','+@F_OIL
    end
     
    if @FDATA <>''
    begin
    set @RowInfo = @RowInfo+', F_DATA'
    set @Content =@Content+','+CHAR(39)+ @FDATA+CHAR(39)
    end
      set @RUN_EXEC ='Insert into [Gps_State ]  ('+ @RowInfo+ ')  values  (' + @Content + ')' 
    exec(@RUN_EXEC)   set nocount OFF
    GO
      

  17.   

    我用asp.net批量插入数据,4312
    条,用了我接近5秒的时间。