3

我有一个相对简单的更新语句:

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

它可以自行运行(大约 1 秒,大约 150.000 条记录)。

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

truncate table sv_konginfo;

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

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

在第二种情况下,我可以做些什么来提高性能?(我们使用的是 Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64 位。)

4

2 回答 2

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;

再次感谢您的意见,他们帮助排除了一些潜在的问题,直到最后链接的行上升到我的脑海中。

于 2010-01-07T15:15:32.883 回答
3

我的第一个猜测是

ANALYZE TABLE sv_konginfo COMPUTE STATISTICS;

或使用DBMS_STATS. 看看管理模式对象

于 2010-01-07T12:42:12.053 回答