insert into T1 select * from T2 如何执行分页

sqlserver2000数据库,需要将T2表的百万条记录插入到T1表,在程序中执行insert into T1 select * from T2 where ...会出现超时,程序无响应并退出。
是否因为数据量太大?考虑通过分页的方法,比如每次select出10000条insert,执行n次完成,该如何写 insert into select 语句?或者有无其他解决方案?

主要看where条件有没有走索引。

数据库中一般都会有REDO和UNDO的概念,
我相信SQLSERVER也有,你如果执行大数据插入和更新的时候一定要注意REDO是否足够大,UNDO是否足够大,因为如果你的事务很长,当一个事务中足够大,那么REDO不够大可能导致数据库挂起,你前台无响应的可能性很大。UNDO不够大则可能导致执行报错。
所以你这个问题我建议你先往REDO过小的方向排查。其次如果要分批处理,并不建议分页处理,为了保证数据全部过来分页需要排序,因此会更慢,且在大部分数据库中必然使用大量的临时表空间,导致额外的工作。如果你决定分批处理。我建议你可以采用某个字段的关键字能大概按一定比例平分数据的字字段,按该字段循环批量插入是最好的。但是仍然不建议分的批次过多。因为较大数据的插入,你多一个批次必然多一次全表扫描。原本一次全表扫描可以完成,你分了10个批次全表扫描估计就是10次。(当然如果某些批次数据少也是可能走索引的)所以每次提交的数据量是要根据你的REDO和UNDO设定的大小来寻找一个合适的值。如果你没有合适的字段进行分配,那么你可以采用like的方式去比如 条件 like '1%' like '2%' 这样分配,like 后模糊仍然也是会走索引的。。但像这种整表迁移用索引可能只会更慢,但是你放心数据库一般还是比较智能的这么简单的SQL。数据库会自行选择走索引还是全表的