我正在尝试通过具有聚集索引的其他索引复制其他表中的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
答案 0 :(得分:1)
首先,您需要删除所有约束,例如唯一性,PK等。这是现有表中每次插入的瓶颈。
第二,如果您向表中插入的记录比现在多得多,则可以使用SELECT INTO
语句代替INSERT
来提高性能。但是请记住,SELECT INTO
创建了一个新表,因此您需要考虑如何附加以前的记录。
最后但并非最不重要的一点是,您可以使用循环并分批插入1M记录。