發現資料庫增長很快,所以查詢一下各個資料表的空間大小。

 

Delete、Truncatetable的差異
參考文章:http://blog.5ibc.net/p/4521.html

引用文章:

delete 不影响表所占用的 extent,HWM 保持原位置不动,即使删除的是最靠近 HWM 的数据。
delete 其实也可以释放空间,但是不降低 HWM,delete 后 block 的空闲空间达到 pct_used,就可以重用。
truncate 缺省情况下将空间(表和索引)释放到 minextents 个 extent,除非使用 reuse storage。truncate
会将高水线复位(回到最开始)。 drop 将表所占用的空间全部释放,segment 不存在,无所谓 HWM 的概念;

 

參考文章:http://zhidao.baidu.com/question/1238172559315670939.html

 

1.刪除原始資料表的資料
DELETE FROM 表名 WHERE ID=1;
COMMIT;--以上为删除数据

2.建立一個暫存資料表備份原始資料
CREATE TABLE TMP AS SELECT * FROM 表名;--将目前表内的数据暂时放到TMP表中

3.將原本資料表進行Truncate
TRUNCATE TABLE 表名;--清空原表数据搜索

4.將資料倒回去原始資料表
INSERT INTO 表名 SELECT * FROM TMP;--将临时表数据反插回去
COMMIT;

 

 


 


--參考文章:
--http://rickyju.pixnet.net/blog/post/23488697-oracle-%3A-oracle-tablespace,-table,-data-size-%E8%A8%88%E7%AE%97
--說明:增加顯示TABLESPACE_NAME

 

SELECT A.TABLESPACE_NAME,A.TABLE_NAME , A.TABLE_SIZE_MB , B.DATA_SIZE_MB
FROM (  
        SELECT TABLESPACE_NAME,SEGMENT_NAME AS TABLE_NAME,
            ROUND(SUM(BYTES) /(1024*1024),2) AS TABLE_SIZE_MB
        FROM USER_EXTENTS
      --WHERE SEGMENT_NAME ='TABLE_NAME'
        GROUP BY TABLESPACE_NAME,SEGMENT_NAME
    ) A LEFT JOIN (
        SELECT TABLESPACE_NAME,TABLE_NAME , ROUND (AVG_ROW_LEN * NUM_ROWS /(1024*1024),2) AS DATA_SIZE_MB 
        FROM DBA_TABLES
        --WHERE TABLE_NAME = 'TABLE_NAME'
    ) B ON (A.TABLE_NAME = B.TABLE_NAME AND A.TABLESPACE_NAME=B.TABLESPACE_NAME)
ORDER BY 3 DESC,4 DESC
 



 --參考文章
 --http://shingdong.blogspot.tw/2013/12/oracle-table.html
 --說明:這個比較好使用,可以找到該DB內的所有Table


    SELECT *
    FROM (SELECT OWNER,
                 TABLE_NAME,
                 SIZE_MB,
                 USE_SPACE_MB,
                 EMPTY_SPACE_MB,
                 ROUND ( (EMPTY_SPACE_MB / SIZE_MB) * 100, 2) ASTE_PER,
                 TABLESPACE_NAME
            FROM (SELECT OWNER,
                         table_name,
                         ROUND ( (blocks * 8) / 1024, 2) "SIZE_MB",
                         ROUND ( (num_rows * avg_row_len / 1024 / 1024), 2) "USE_SPACE_MB",
                         ROUND (
                              (blocks * 8 - (num_rows * avg_row_len / 1024))
                            / 1024,  2) "EMPTY_SPACE_MB",
                         TABLESPACE_NAME
                    FROM DBA_TABLES))
   WHERE EMPTY_SPACE_MB > 0 --AND SIZE_MB > 1024
ORDER BY 5 DESC;
 



--參考文章:
--http://frankiestudy.blogspot.tw/2013/04/oracle.html

 

  SELECT TABLE_NAME, AVG_ROW_LEN, NUM_ROWS,
    ROUND (AVG_ROW_LEN * NUM_ROWS /(1024*1024*1024),2) AS DATA_SIZE_GB
  FROM DBA_TABLES 
  WHERE ROUND(AVG_ROW_LEN * NUM_ROWS /(1024*1024*1024),2) > 0
  ORDER BY ROUND(AVG_ROW_LEN * NUM_ROWS /(1024*1024*1024),2) DESC;

 

 

arrow
arrow
    全站熱搜

    Nathan 發表在 痞客邦 留言(0) 人氣()