發現資料庫增長很快,所以查詢一下各個資料表的空間大小。
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;
留言列表