2012-03-02 77 views
4

在我的Oracle數據庫中,我有一個大小爲3.44 GB的表。它有1784486行和450146,對應於8 kB塊大小,每塊平均4行,或每行2 kB。但是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'的輸出嗎? – 2012-03-02 17:42:36

+0

我從TOAD獲取數字。 (另外我忘了補充一下,這個表格是以前一種格式轉換表格創建的,所以不應該刪除任何東西,並且不應該有無人認領的空白空間。) – AFoglia 2012-03-02 17:59:46

+1

如果我自己對dba_segments進行查詢,我獲得與TOAD匹配的3695181824字節的大小。我只是運行了一個'select count(*)',而且令人驚訝的是,它確實有所不同,1787088與TOADs 1784486不同。仍然不足以解釋我所看到的巨大差異。 – AFoglia 2012-03-02 18:10:16

回答

4

好的。讓我們先搞清楚蟾蜍在

得到你正在尋找的數字開始什麼

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

我得到(3.44140625,451072)size_in_gb和size_in_blocks。對於我得到的第二個查詢(1784486,450146,0,369,2012-Jan-14 14:02:29))。 (該表大致是在那時創建的,自創建以來沒有增加任何內容。)如上所述,計數爲1787088. – AFoglia 2012-03-02 18:21:34

+0

我只是猜測8kB塊的大小。我不是管理員,我忘了我在哪裏找到它,但它似乎是通常的設置,並且它的大小與塊的數量相除。 – AFoglia 2012-03-02 18:23:13

+1

@Afoglia - 好的。你是否也可以運行我剛發佈的'DBMS_SPACE'調用併發布結果? – 2012-03-02 18:29:27

相關問題