代码之家  ›  专栏  ›  技术社区  ›  ystan-

Oracle 12c:浪费的磁盘空间和性能

  •  2
  • ystan-  · 技术社区  · 9 年前

    我的应用程序的本质是每天删除大型数据集并将其批量插入Oracle 12c数据库。我的表按日期字段进行间隔分区,并分区索引。我使用存储过程在每次运行后收集受影响分区的统计信息。最近,我发现运行速度明显放缓,我想知道这是否是由于数据库的大小不断增大。

    select sum(bytes)/1024/1024/1024 
    from dba_segments 
    where owner='SCHEMA' and segment_name in ('TABLE_A', 'TABLE_B');
    

    然而,这些数字是巨大的,不能反映实际使用的数据量。当我们将表导出以恢复到另一个数据库时,文件比查询显示的要小得多。我深入挖掘,得出了这个问题:

    select partition_name, 
           blocks*8/1024 size_m, 
           num_rows*avg_row_len/1024/1024 occ_m, 
           blocks*8/1024 - num_rows*avg_row_len/1024/1024 wast_m 
    from dba_tab_partitions 
    where table_name='TABLE_A'; 
    

    此查询表明存在“浪费”空间概念,即在执行大容量插入并删除数据之后,在再次替换数据之前,不会回收使用的空间。

    因此,我有以下问题:

    1. 当我 表演 delete from table where .. ?
    2. 两者之间有区别吗 表演 与下降相比 关于“浪费”空间的分区?
    3. 是否建议定期执行表重组/碎片整理以回收表空间?
    3 回复  |  直到 8 年前
        1
  •  1
  •   atokpas    9 年前

    当我执行从表中删除时,“浪费”的空间是否会导致性能下降。。?

    是的,您正在从表中删除。Oracle必须对基础表执行全表扫描/索引范围扫描(索引叶节点可能导致空块),直到高水位线,这使您的删除速度变慢。

    在“浪费”空间方面,从表中执行删除与删除分区有什么区别吗?

    删除是一个缓慢的过程。它必须先创建图像(撤消)、更新索引、写入重做日志并删除数据。由于DDL(Drop)不会生成重做/撤消(为元数据生成少量的撤消/重做),因此它将比DML(删除)更快。

    是否建议定期执行表重组/碎片整理以回收表空间?

    具有零碎可用空间的对象可能会导致大量空间浪费,并可能影响数据库性能。整理和回收此空间的首选方法是执行联机段收缩。

    详情如下: Reclaiming Unused Space

    下面的博客文章演示了DML期间由于浪费空间而产生的性能影响,以及如何消除这些影响。

    Defragmentation Can Degrade Query Performance

        2
  •  1
  •   Community Mohan Dere    9 年前

    如果您正在进行删除或更新,您的空间将变得支离破碎。你可以在 documentation .

    要改进流程,您可以执行以下清洁操作: shrink 或者只是在一些大插入上重新创建表。我的意思是,不执行删除和插入操作,而是创建表作为从旧的where行中选择不删除的行,然后将新的集合插入到新表中。之后,只需交换名称并删除旧表。

    关于你的第二个问题,我认为答案是 here 删除分区将减少HWM,而删除不会。

        3
  •  0
  •   David Aldridge    9 年前

    此查询表明存在“浪费”空间概念,即在执行大容量插入并删除数据之后,在再次替换数据之前,不会回收使用的空间。

    这是正确的。

    直接路径插入使用线段高水位线上方的空间。后续删除会删除行,但不会重置高水位线。

    最好在执行另一个直接路径插入之前截断该段,因为这将重置高水位线并删除所有行。