Oracle計算表所佔用空間大小

來源:互聯網
上載者:User

Oracle計算表所佔用空間大小

在Oracle資料庫中,如何計算一個表所佔用的儲存空間呢?我們可以通過系統檢視表DBA_SEGMENTS、USER_SEGMETNS、DBA_TABLES來查看一個表所佔空間的大小,如下所示:

SELECT SEGMENT_NAME              TABLE_NAME
      ,SUM(BLOCKS)              BLOCKS
      ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
FROM USER_SEGMENTS
WHERE  SEGMENT_TYPE='TABLE'
  AND SEGMENT_NAME=&TABLE_NAME
GROUP BY SEGMENT_NAME;
 
 
SELECT SEGMENT_NAME              TABLE_NAME
      ,SUM(BLOCKS)              BLOCKS
      ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
FROM DBA_SEGMENTS
WHERE  SEGMENT_TYPE='TABLE'
  AND SEGMENT_NAME=&TABLE_NAME
GROUP BY SEGMENT_NAME;

注意,如果你通過系統檢視表DBA_TABELS、USER_TABLES統計、查看錶所佔的空間大小,那麼由於統計資訊過時或總是持續有DML操作(INSERTR、UPDATE、DELETE),那麼有可能用下面SQL統計出的資訊可能不準確。需要先收集一下表對象的統計資訊。 另外,可能每個資料庫的db_block_size有所不同,不一定是8192。所以注意修改.


ANALYZE TABLE OWNER.TABLE_NAME COMPUTE STATISTICS;
 

 
EXEC DBMS_STATS.GATHER_TABLE_STATS('OWNER','TABLE_NAME');
 
 
SELECT OWNER                    OWNER_NAME
      ,TABLE_NAME              TABLE_NAME
      ,TABLESPACE_NAME          TABLESPACE_NAME
      ,BLOCKS                  ACTUAL_BLOCKS
      ,BLOCKS + EMPTY_BLOCKS    TOTAL_BLOCKS
      ,(BLOCKS + EMPTY_BLOCKS) * 8192/(1024*1024)
                                "TABLE_SIZE[MB]"
FROM DBA_TABLES
WHERE OWNER=&OWNER
  AND TABLE_NAME=&TABLE_NAME

關於DBA_TABLES和DBA_SEGMENTS表中的block的區別,其實它們的關係如下所示:

      自動段空間管理(Automatic Segment Space Management ASSM)

              dba_segments.blocks = dba_tables.blocks + dba_tables.empty_blocks

      本地管理資料表空間(Locally Managed Tablespace )

              dba_segments.blocks = dba_tables.blocks + dba_tables.empty_blocks+ 1(SEGMENT HEADER BLOCK)

 

DBA_SEGMENTS.BLOCKS      holds the total number of blocks allocated to the table.

DBA_TABLES.BLOCKS        holds the total number of blocks allocated for data.

DBA_SEGMENTS中的blocks表示分配給表的儲存空間,而DBA_TABLES中blocks表示表中資料實際佔有的儲存空間。所以這個是有細微差別的。所以你如果要查表的實際佔用大小,那麼就要使用DBA_TABLES來查詢。查看資料庫中佔用儲存空間從大到小的所有表對象


SELECT SEGMENT_NAME              TABLE_NAME
      ,SUM(BLOCKS)              BLOCKS
      ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
FROM DBA_SEGMENTS
WHERE  SEGMENT_TYPE='TABLE'
GROUP BY SEGMENT_NAME
ORDER BY BLOCKS DESC;

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.