获取数百万条记录的速度太慢

时间:2018-07-30 10:47:29

标签: sql sql-server sql-server-2008 sql-server-2012

我正在尝试通过具有聚集索引的其他索引复制其他表中的6000万条记录。但是经过2000万条记录后,速度太慢了。我不应该怎么办。有人可以帮我吗?嗨,这是我的时间计数。

1000000万人:1
2000000百万:0
3000000百万:0
4000000百万分钟:2
5000000百万:2
6000000百万分钟:1
7000000百万分钟:0
8000000万人:1
9000000百万:0
1000万分钟:1
1100万分钟:0
1200万最小值:1
1300万分钟:1
1400万分钟:0
1500万分钟:1
1600万最小值:1
1700万最小值:1
1800万最小值:0
1900万最小值:1
2000亿分钟:3
2亿1千万分钟:3
2亿2千万分钟:4
2亿3千万分钟:5
2400亿分钟:4
2500万分钟:4
2600亿分钟:4
2700万分钟:4
2800亿分钟:5
2900亿分钟:5
3亿分钟最小值:5
3100亿分钟:6
3200万最小值:7
3亿3千万分钟:7
3400亿分钟:8
3500万分钟:8
3600万分钟:9
3700万分钟:8
38000000万最小值:10
3900亿分钟:10
4000亿分钟:11
4100亿分钟:11
4亿2千万分钟:11
4300亿分钟:12
4400亿分钟:11
4.5亿分钟:12
4600亿分钟:12
47000000百万分钟:14
48000000百万分钟:13
49000000百万分钟:13
5,000万分钟:14
5100亿分钟:15
52000000百万分钟:14
5300亿分钟:16
54000000百万最小值:18
5500万最小值:18
5600亿分钟:20
57000000百万分钟:19
58000000百万分钟:21
59000000百万分钟:19

    
declare 
        @RecNo Int
      , @RecCount Int

      , @RecordST nvarchar(max)
      , @str_date datetime
      , @end_date datetime;

    Set @RecNo = 0
    select @RecCount = 1000000

         While 1 = 1 
           Begin


                set @str_date = getdate();
                Insert Into dbo.test2(
                   ap_id                                
                  ,lipt_id                          
                  ,li_cntr                                            
                 )
            select 
                     ap_id                              
                    ,lipt_id                            
                    ,li_cntr                                                
                 from dbo.test 
             order by  ap_id, lipt_id, li_cntr

             offset @RecNo rows
             fetch next @RecCount rows only;
             if  @@ROWCOUNT = 0
               break              

             Set @RecNo += 1000000;

             set @end_date = GETDATE() ;
             set @RecordST = cast(@RecNo as nvarchar(max)) + ' Million Min:'+cast(DATEDIFF(MINUTE,@str_date,@end_date) as nvarchar(max))
             RAISERROR(@RecordST,0,0) WITH NOWAIT            

  end

1 个答案:

答案 0 :(得分:1)

首先,您需要删除所有约束,例如唯一性,PK等。这是现有表中每次插入的瓶颈。

第二,如果您向表中插入的记录比现在多得多,则可以使用SELECT INTO语句代替INSERT来提高性能。但是请记住,SELECT INTO创建了一个新表,因此您需要考虑如何附加以前的记录。

最后但并非最不重要的一点是,您可以使用循环并分批插入1M记录。