web-dev-qa-db-ja.com

DBA_SEGMENTSがDBA_TABLESの2倍の量のデータを表示するのはなぜですか?

次の手順を使用して、監査ログテーブルの使用量を計算しようとしました。

  1. すべての監査ログテーブルデータを切り捨てます(つまり、AUD$
  2. データを挿入および更新するテストケースを実行し、ステートメントも削除しますが、何も削除しません。
  3. Dbaセグメントで使用されるバイトを測定します。

    select tablespace_name,bytes from dba_segments
    where tablespace_name ='SYSTEM'
    and SEGMENT_NAME = 'AUD$';
    
  4. 統計データの再計算。

  5. 統計データで使用されているバイトを取得します。

    select NUM_ROWS * AVG_ROW_LEN as BYTE_USED
    from DBA_TABLES where TABLE_NAME = 'AUD$';
    

#3から取得した値が#5の値の2倍以上です。割り当てが多すぎるのはなぜですか?

2
Nap

_dba_tables_での選択は考慮されません。

  • テーブル内の空のブロック(特にinitial/nextminextentsおよびfreelist関連のストレージパラメータを参照)
  • ブロック内の空きスペース(主に_pct_free_による)
  • ブロックヘッダー(initransは、特にこのサイズに影響します)

つまりデータの物理ストレージはまったく考慮されていません。一方、_dba_segments_は、含まれるデータ量に関係なく、セグメントの物理ブロックのみをカウントします。

_pct_free_が50%に設定されていて更新されていないテーブルには、たとえば統計的に半分空のブロックがあり、_dba_tables_で実行した計算では、_dba_segments_と比較するとそれがわかります。

データベースへのデータの格納方法(および関連するオーバーヘッド)の詳細については、 論理ストレージ構造 ドキュメントを参照してください。

6
Mat