2012-03-02 14 views
4

私のOracleデータベースでは、サイズが3.44 GBのテーブルがあります。それは1784486行で、450146は8kBのブロックサイズに対応し、ブロックあたり平均4行、または行あたり2kBです。しかし、AVG_ROW_LENはわずか369バイトです。不平等の原因は何ですか?なぜ私のテーブルサイズはavg_row_lenから予想されるよりも約10倍大きいのですか?

詳細:

PCT_FREEが唯一の10ですので、それが責任を負うべきではありません。圧縮は現在オフになっています。テーブルレイアウトは(列名は一般化)

KEY   NUMBER(38)   NOT NULL, 
DATE1   DATE     NOT NULL, 
DATE2   DATE     NOT NULL, 
POINT   NUMBER(4)   NOT NULL, 
NAME   VARCHAR2(200 BYTE) NOT NULL, 
BLOB_SIZE  NUMBER(38)   NOT NULL, 
BLOB_TYPE  VARCHAR2(8 BYTE)  NOT NULL, 
BLOB_FILTERS VARCHAR2(64 BYTE) NOT NULL, 
BLOB_DATA  BLOB     NOT NULL, 
PRECOMPUTED RAW(2000) -- currently no more than ~200 bytes 
          -- (15 doubles, plus some headers) 
+2

テーブルのサイズが3.44 GBであることをどのように判断していますか?あなたは 'ALL_SEGMENTS'を見ていますか?どのように行の数を決定していますか? 'COUNT(*)'を実行することによって?あるいは 'ALL_TABLES'の' NUM_ROWS'を見ることによって?どのようにブロックの数を決定していますか?この表の統計は正確で最新ですか?このオブジェクトの 'DBMS_SPACE.SPACE_USAGE'の出力を見ましたか? –

+0

私はTOADから数字を取得しています。 (また、私は追加することを忘れて、このテーブルは、以前の形式でテーブルを変換から構築されたので、何も削除されている必要があります、そして、unclaimed空白スペースがない必要があります。) – AFoglia

+1

私はdba_segmentsに対して自分自身でクエリを行う場合、 TOADと一致する3695181824バイトのサイズを取得します。私はちょうど 'select count(*)'を実行しましたが、驚くべきことに、1787088対TOADs 1784486が異なります。私が見ている大きな違いを説明するにはまだ十分ではありません。 – AFoglia

答えて

4

OKです。ヒキガエルは、あなたがテーブルの大きさのため

SELECT sum(bytes)/1024/1024/1024 size_in_gb, 
     sum(blocks) size_in_blocks 
    FROM dba_segments 
WHERE owner = <<owner of table>> 
    AND segment_name = <<name of table>> 

リターンを何

見ている数字を取得している場所を把握することから始めてみましょうか?

表の統計のための

SELECT num_rows, blocks, empty_blocks, avg_row_len, last_analyzed 
    FROM all_tables 
WHERE owner = <<owner of table>> 
    AND table_name = <<name of table>> 

リターンを何?

テーブル内の行の実際の数について

SELECT COUNT(*) 
    FROM <<owner of table>>.<<name of table>> 

リターンを何?

DECLARE 
    l_unformatted_blocks number; 
    l_unformatted_bytes number; 
    l_fs1_blocks number; 
    l_fs1_bytes number; 
    l_fs2_blocks number; 
    l_fs2_bytes number; 
    l_fs3_blocks number; 
    l_fs3_bytes number; 
    l_fs4_blocks number; 
    l_fs4_bytes number; 
    l_full_blocks number; 
    l_full_bytes number; 
BEGIN 
    dbms_space.space_usage (<<table owner>>, <<table name>>, 'TABLE', 
          l_unformatted_blocks, l_unformatted_bytes, 
          l_fs1_blocks, l_fs1_bytes, l_fs2_blocks, l_fs2_bytes, 
          l_fs3_blocks, l_fs3_bytes, l_fs4_blocks, l_fs4_bytes, 
          l_full_blocks, l_full_bytes); 
    dbms_output.put_line('Unformatted Blocks = '||l_unformatted_blocks); 
    dbms_output.put_line('FS1 Blocks = '||l_fs1_blocks); 
    dbms_output.put_line('FS2 Blocks = '||l_fs2_blocks); 
    dbms_output.put_line('FS3 Blocks = '||l_fs3_blocks); 
    dbms_output.put_line('FS4 Blocks = '||l_fs4_blocks); 
    dbms_output.put_line('Full Blocks = '||l_full_blocks); 
END; 

は、テーブル内のブロックが利用されている方法については、何を示していますか?

1月14日14:02:29に行が更新されましたか?特に、比較的小さい行数が挿入されたが、その後サイズが大きくなるように更新された可能性はありますか?テーブルの統計を再集計すると何か変更されますか

BEGIN 
    dbms_stats.gather_table_stats(ownname   => <<owner of table>>, 
           tabname   => <<name of table>>, 
           estimate_percent => null, 
           granularity  => 'ALL'); 
END; 
+0

size_in_gbとsize_in_blockについては(3.44140625,451072)です。 2番目のクエリについては、(1784486、450146、0、369、2012年1月14日14:02:29))。 (テーブルはおおよそ作成され、最初の作成以来何も追加されていません)。そして、上記のように、カウントは1787088です。 – AFoglia

+0

私はちょうど8kBのブロックサイズを推測しています。私は管理者ではなく、見つけた場所は忘れていましたが、通常の設定であるように見えますが、サイズをブロック数で割った値と一致しています。 – AFoglia

+1

@AFoglia - OK。ちょうど私が掲示し、結果を投稿した 'DBMS_SPACE'呼び出しを実行できますか? –

関連する問題