+ -
当前位置:首页 → 问答吧 → 天煞的,把临时表数据插入实体表超慢,大家来看看

天煞的,把临时表数据插入实体表超慢,大家来看看

时间:2011-12-12

来源:互联网

sql2008
临时表数据400万,实体表是空表
先测试一次,直接insert into 实体表 select * from 临时表,耗时大概在10几秒左右,感觉挺正常
正式开始,临时表需要连接一个200万左右的实体表1,查询结果也是400万,插入上面的实体表,超级慢
例如:
insert into 实体表(a,b,c,d)
select t.a,t.b,t.c,s.d
from #tmp t,table s
where t.d is null
and t.a=s.a
and t.b=s.b
超级慢,我也建立了索引了,应该和查询速度无关,至少select top 100 在5秒内,可就是insert into 实体表就超级慢,取消也没用,进程杀不掉,要重启,郁闷死了,我搞不懂到底哪里卡住了,大家帮忙想想法子,谢谢了

作者: niss   发布时间: 2011-12-12

select COUNT(1)
from #tmp t,table s
where t.d is null
and t.a=s.a
and t.b=s.b

这样的速度如何

作者: guguda2008   发布时间: 2011-12-12

分批导试试呢。

作者: fredrickhu   发布时间: 2011-12-12

引用 2 楼 fredrickhu 的回复:

分批导试试呢。

我猜测他是慢在把400W数据的临时表和200W数据的临时表加载到内存里并做hash连接,TOP100快是因为只连接了前100条。如果加了ORDER BY应该也会快的。如果是这种原因,分批导一样不会快,因为分批也要加排序。

另一个原因可能是INSERT时数据库文件大小需要增加,但如果只是4个短字段的插入应该不太可能导致,因为最多几十M。

作者: guguda2008   发布时间: 2011-12-12

引用 3 楼 guguda2008 的回复:
引用 2 楼 fredrickhu 的回复:

分批导试试呢。

我猜测他是慢在把400W数据的临时表和200W数据的临时表加载到内存里并做hash连接,TOP100快是因为只连接了前100条。如果加了ORDER BY应该也会快的。如果是这种原因,分批导一样不会快,因为分批也要加排序。

另一个原因可能是INSERT时数据库文件大小需要增加,但如果只是4个短字段的插入应该不太可能导致,……


只要排序了效率就不会高了

作者: fredrickhu   发布时间: 2011-12-12

打错字了,是不会快。

作者: guguda2008   发布时间: 2011-12-12

引用 1 楼 guguda2008 的回复:
select COUNT(1)
from #tmp t,table s
where t.d is null
and t.a=s.a
and t.b=s.b

这样的速度如何

13秒出来总数,现在目标实体表删不掉,重启了也删不掉,天煞的,郁闷啊

作者: niss   发布时间: 2011-12-12

引用 3 楼 guguda2008 的回复:
引用 2 楼 fredrickhu 的回复:

分批导试试呢。

我猜测他是慢在把400W数据的临时表和200W数据的临时表加载到内存里并做hash连接,TOP100快是因为只连接了前100条。如果加了ORDER BY应该也会快的。如果是这种原因,分批导一样不会快,因为分批也要加排序。

另一个原因可能是INSERT时数据库文件大小需要增加,但如果只是4个短字段的插入应该不太可能导致,……

字段是举例的,但数据文件的增长我设置了每次2G,无容量限制,另外内存8G

作者: niss   发布时间: 2011-12-12

t.d is null在放入临时表时就应该过滤掉

作者: ssp2009   发布时间: 2011-12-12

我真的很想骂街,
select t.a,t.b,t.c,s.d into lsb
from #tmp t,table1 s
where t.d is null
and t.a=s.a
and t.b=s.b

耗时28秒,这是怎么搞的,为什么我建好的实体表通过insert into 就会卡机,等了超过28分钟都没结果,还杀不了进程,这张实体表就一个字段主键,类型是decimal(12),难道和这有关系?

作者: niss   发布时间: 2011-12-12

你那个用来建临时表的"实体表",是否有用户在其上工作?如果用户在插入更新操作,那表上就会有锁,你读取的时候当然就会慢.

作者: qianjin036a   发布时间: 2011-12-12

既然实体表是空表
删除实体表
换成select into 的方式
SQL code
SELECT  t.a ,
        t.b ,
        t.c ,
        s.d
INTO    实体表
FROM    #tmp t ,
        [table] s
WHERE   t.d IS NULL
        AND t.a = s.a
        AND t.b = s.b
--然后再增加其它列约束之类

作者: wufeng4552   发布时间: 2011-12-12

热门下载

更多