截断后缓慢更新

时间:2010-01-07 12:30:59

标签: sql oracle truncate

我有一个相对简单的更新声明:

update sv_konginfo ki
set AnzDarl = 1 
where kong_nr in ( 
    select kong_nr
    from sv_darlehen
    group by kong_nr
    having count (*) = 1);

单独运行(约150秒记录约1秒)。

但是,如果我截断表格然后重新插入记录:

truncate table sv_konginfo;

insert into sv_konginfo (kong_nr)
select distinct kong_nr
from sv_darlehen;

更新语句运行速度非常慢(超过一分钟)处理完全相同的数据。

我可以做些什么来改善第二种情况下的表现? (我们使用的是Oracle数据库10g企业版10.2.0.3.0 - 64位。)

2 个答案:

答案 0 :(得分:4)

感谢您的投入,他们帮助我找出导致问题的原因:Chained Rows!

  • 插入新行AnzDarl(和许多其他列)后为空
  • 当列设置为1(或其他值)时,它们会占用更多空间

我可以使用以下SQL检查:

select chain_cnt 
from user_tables 
where table_name='SV_KONGINFO';

在Truncate之后,chain_cnt为0.运行Update后,chain_cnt急剧增加,并且等于受影响的行数。

像这样增加PCT_FREE解决了我的性能问题:

alter table sv_konginfo pctfree 40;

再次感谢您的投入,他们帮助排除了一些潜在的问题,直到最终链接的行成为我的最高层。

答案 1 :(得分:3)

我的第一个猜测是

ANALYZE TABLE sv_konginfo COMPUTE STATISTICS;

或使用DBMS_STATS。看看Managing Schema Objects