代码之家  ›  专栏  ›  技术社区  ›  Thorsten

截断后更新缓慢

  •  3
  • Thorsten  · 技术社区  · 15 年前

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

    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秒钟,大约15万条记录)。

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

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

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

    在第二个场景中,我可以做些什么来提高性能?(我们使用的是Oracle数据库10g企业版10.2.0.3.0-64位版本。)

    2 回复  |  直到 15 年前
        1
  •  4
  •   Thorsten    15 年前

    感谢您的输入,他们帮助我找出了导致问题的原因:链接行!

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

    我可以使用以下SQL进行检查:

    select chain_cnt 
    from user_tables 
    where table_name='SV_KONGINFO';
    

    截断后,链cnt为0。运行更新后,链cnt显著增加,等于受影响的行数。

    像这样增加免费PCT解决了我的性能问题:

    alter table sv_konginfo pctfree 40;
    

    再次感谢输入,他们帮助排除了一些潜在的问题,直到最后链接的行出现在我的脑海中。

        2
  •  3
  •   Peter Lang    15 年前

    我的第一个猜测是

    ANALYZE TABLE sv_konginfo COMPUTE STATISTICS;
    

    或使用 DBMS_STATS . 看一看 Managing Schema Objects .