为什么 DBA_SEGMENTS 显示的数据量是 DBA_TABLES 的两倍?

Nap*_*Nap 2 oracle statistics tablespaces

我尝试使用以下步骤计算审计日志表的使用情况:

  1. 截断所有审计日志表数据(即AUD$
  2. 执行插入和更新数据的测试用例,还有删除语句,但它不会删除任何内容。
  3. 测量 dba 段上使用的字节。

    select tablespace_name,bytes from dba_segments
    where tablespace_name ='SYSTEM'
    and SEGMENT_NAME = 'AUD$';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 重新计算统计数据。

  5. 检索统计数据中使用的字节。

    select NUM_ROWS * AVG_ROW_LEN as BYTE_USED
    from DBA_TABLES where TABLE_NAME = 'AUD$';
    
    Run Code Online (Sandbox Code Playgroud)

我从#3 得到的值是#5 的两倍多,为什么分配太多了?

Mat*_*Mat 6

您的选择dba_tables不考虑:

  • 在表中的空块(见initial/ nextminextentsfreelist等等-相关的存储参数)
  • 块中的空白空间(pct_free主要是由于)
  • 块头(initrans影响这个大小等)

即它根本不考虑数据的物理存储。dba_segments另一方面,只计算段的物理块,而不管它们包含多少数据。

例如,pct_free设置为 50% 且从未更新的表将具有统计上的半空块,并且您所做的计算dba_tables将显示与dba_segments.

请参阅逻辑存储结构文档以了解有关如何将数据存储在数据库中(以及所涉及的开销)的更多信息。