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

Oracle 12c:浪费的磁盘空间和性能,oracle,performance,partition,Oracle,Performance,Partition,我的应用程序的本质是每天删除大型数据集并将其批量插入到Oracle 12c数据库中。我的表按日期字段进行间隔分区,并进行分区索引。每次运行后,我使用存储过程收集受影响分区的统计信息。最近,我发现运行速度明显减慢,我想知道这是否是由于数据库的大小增加所致 我搜索了如何计算表使用的总磁盘空间,通常得出以下结论: select sum(bytes)/1024/1024/1024 from dba_segments where owner='SCHEMA' and segment_name in (

我的应用程序的本质是每天删除大型数据集并将其批量插入到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'; 
此查询表明存在“浪费”空间的概念,即在执行大容量插入和删除数据后,在再次替换数据之前,所使用的空间不会被回收

因此,我有以下问题:

  • 当我运行时,“浪费”的空间是否会导致性能下降 执行
    从表中删除,其中..
  • 两者之间有区别吗 执行从表中删除,其中..与删除相比 关于“浪费”空间的分区
  • 是否建议定期执行表重组/碎片整理以回收表空间

  • 如果您正在进行删除或更新,您的空间将变得支离破碎。你可以在报纸上读到

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

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

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

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

    从表中执行删除是否有区别,其中。。与删除“浪费”空间的分区相比

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

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

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

    详情如下:

    下面的博文演示了DML过程中由于浪费空间而产生的性能影响,以及如何消除这种影响

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

    这是正确的

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


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

    删除部分或插入部分需要更长时间吗?分而治之。我认为空闲空间是一件好事,因为下次插入数据时,Oracle不必浪费时间来扩展文件。(但我不是甲骨文专家)