【发布时间】:2018-04-11 22:59:42
【问题描述】:
直接路径插入表将使 Oracle 在高水位线之上创建新块,而传统插入将填充高水位线以下任何未使用/已释放的块。这就是为什么建议只对大量数据使用直接路径插入,因为重复的直接路径插入会浪费大量空间。
我有一个表,其中没有执行删除、更新或常规插入,唯一执行的操作是直接路径插入。
我怎样才能知道高水位线以下的每个块中有多少空间由于滥用直接路径插入而被浪费了?
【问题讨论】:
直接路径插入表将使 Oracle 在高水位线之上创建新块,而传统插入将填充高水位线以下任何未使用/已释放的块。这就是为什么建议只对大量数据使用直接路径插入,因为重复的直接路径插入会浪费大量空间。
我有一个表,其中没有执行删除、更新或常规插入,唯一执行的操作是直接路径插入。
我怎样才能知道高水位线以下的每个块中有多少空间由于滥用直接路径插入而被浪费了?
【问题讨论】:
你可以通过一些简单的假设得到一个快速的近似值:
SQL> select blocks, empty_blocks, round(avg_row_len * num_rows / ( 1 - pct_free/100) * ( 8192 / ( 8192 - 100 ) )/8192 ) guess_blks
2 from user_tables
3 where table_name = 'T';
BLOCKS EMPTY_BLOCKS GUESS_BLKS
---------- ------------ ----------
1563 0 1430
所以在我的例子中,我的表消耗了 1563 个块,并使用行长 * 行数的粗略算法,针对 pctfree 进行了调整,并针对每个块的 100 字节开销进行了调整,我猜测我需要多少块大约是 1430。然后,我还可以将其与查看 user_segments 所消耗的实际空间进行比较
SQL> select bytes/8192 from user_Segments
2 where segment_name = 'T';
BYTES/8192
----------
1664
【讨论】:
首先你需要知道oracle中一张表的pctfree。
那么 dbms_space 包会帮助你。
根据您对问题的描述和您的声誉/徽章,
我认为您的研究会很快获得详细信息。
【讨论】: