1. 程式人生 > >Delete/Truncate刪除,釋放表空間、降低高水位線、resize釋放磁碟空間相關優化

Delete/Truncate刪除,釋放表空間、降低高水位線、resize釋放磁碟空間相關優化

硬碟空間不足,打算刪除資料庫中的多餘資料,但刪除資料後,硬碟硬碟空間不能釋放。
【delete後用:alter table table_name move    truncate後用:alter table table_name deallocate unused 均不可解決】

解決方法:

--delete/truncate刪除,釋放表空間、降低高水位線、resize釋放磁碟空間相關優化彙總
--查詢DBF檔案、資料庫空間、高水位線佔用情況
select /*+ ordered use_hash(a,b,c) */
 a.file_id,
 a.file_name,
 a.tablespace_name,
 a.filesize,
 b.freesize,
 (a.filesize - b.freesize) usedsize,--使用空間
 c.hwmsize,
 c.hwmsize - (a.filesize - b.freesize) unsedsize_belowhwm,--未使用空間
 a.filesize - c.hwmsize canshrinksize--檔案大小
  from (select tablespace_name,file_id, file_name, round(bytes / 1024 / 1024) filesize
          from dba_data_files) a,
       (select file_id, round(sum(dfs.bytes) / 1024 / 1024) freesize
          from dba_free_space dfs
         group by file_id) b,
       (select file_id, round(max(block_id) * 8 / 1024) HWMsize--高水位線
          from dba_extents
         group by file_id) c
 where a.file_id = b.file_id
   and a.file_id = c.file_id
 order by unsedsize_belowhwm desc


--查詢【各使用者】【表空間】資料儲存空間佔用大小(使用者與表空間對應關係)
select owner,tablespace_name ,sum(bytes)/1024/1024 from dba_segments group by owner,tablespace_name


--查詢當前使用者【表】資料儲存空間佔用大小
select segment_name, bytes/1024/1024 
from user_segments 
where segment_type = 'TABLE';


--查詢當前使用者【所有物件】資料儲存空間佔用大小
Select segment_type,Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name,segment_type

--查詢【表空間】與【DBF】對應關係與儲存情況
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;


--刪除表資料
truncate table ZW_FZHSZD
TRUNCATE TABLE JC_ASSETS_ADD  --DROP STORAGE


--分析(不分析,會導致下面步驟查詢表的高水位線時候數值會不準)
 ANALYZE TABLE ZW_FZHSZD ESTIMATE STATISTICS;

--查詢表的水位分配情況
SELECT blocks, empty_blocks, num_rows 
 FROM user_tables 
 WHERE table_name = 'ZW_FZHSZD';


--TRUNCATE後可釋放表資料庫空間,表預設把TRUNCATE資料前的空間大小作為初始空間大小,表的高水位線不會降低,需要Shring收縮表的大小(下面詳解)後方可降低表的水位線

--釋放/收縮表資料庫空間
--alter table tablename move --選擇性操作,delete後可通過此方法釋放資料庫空間,但此操作MOVE時需要雙倍的表空間,大表有可能會導致高水位線提高,而且如果表上有索引的話,需要重構索引,不建議使用

alter table tablename deallocate unused keep 0;--成功釋放資料庫空間,但高水位線不降低(表的高水位線降低,表空間的不降低??)

alter table JC_ASSETS_CHANGE enable row movement;--開啟movement功能
alter index xx rebuild--movement後需要重建索引(未驗證可行性)
ALTER TABLE USERS SHRINK SPACE --cascade --成功收縮表的資料庫空間為最小值,但【表空間】水位有時降低、有時不降低,原因不詳


--回縮索引為最小值(選擇性操作)
ALTER INDEX INDEXINDEX1_FZHSZD  SHRINK SPACE


--查詢最大可resize空間
select a.file#,
a.name,
a.bytes / 1024 / 1024 CurrentMB,
ceil(HWM * a.block_size / 1024 / 1024) Resizeto,
(a.bytes - HWM * a.block_size) / 1024 / 1024 releaseMB,
'alter database datafile ''' || a.name || ''' resize ' ||
ceil(HWM * a.block_size / 1024 / 1024) || 'M;' ResizeCmd
from v$datafile a,
(select file_id, max(block_id + blocks - 1) HWM
from dba_extents
group by file_id) b
where a.file# = b.file_id(+)
and (a.bytes - HWM * a.block_size) > 0
order by 5


--Resize釋放硬碟空間(resize值必須大於高水位線,所以降低水位線非常重要)
ALTER DATABASE DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' resize 1000M;


--釋放HWM上面的未使用空間,但是並不會釋放HWM下面的自由空間,也不會移動HWM的位置.
 Alter  table table_name deallocate unused


終極方法:把表空間A內所有物件(表、索引)移動到表空間B,然後Resize 表空間A為最少值(表空間內所有物件移走後高水位線會降到最低),然後再把物件從表空間B移回表空間A(測試可用,但不知道有沒副作用)


PS:
【清理臨時表空間方法】
ALTER TABLESPACE 臨時表空間名 SHRINK SPACE KEEP 512M
EMP:ALTER TABLESPACE TEMP_FMMS2 SHRINK SPACE KEEP 512M


--表空間DBF檔案大小
select bytes/1024/1024  free_size from dba_data_files where tablespace_name='USERS';


--表空間空閒空間
select  SUM(BYTES/1024/1024) total_size from dba_free_space where tablespace_name='USERS';

--表空間水位線
select max(block_id)*8/1024 "m size" from dba_extents where tablespace_name='USERS'

相關推薦

Delete/Truncate刪除,釋放空間降低水位resize釋放磁碟空間相關優化

硬碟空間不足,打算刪除資料庫中的多餘資料,但刪除資料後,硬碟硬碟空間不能釋放。 【delete後用:alter table table_name move    truncate後用:alter table table_name deallocate unused 均不可

oracle 水位詳解

一、什麼是水線(High Water Mark)? 所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞) 都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。這個HWM是一個標記,用來說明已經有多少沒

Oracle段中的水位HWM+修正ORACLE水位

Oracle表段中的高水位線HWM   在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任

TRUNCATE TABLE 與 DELETE刪除整個的所有記錄時的區別具體到效能,效率,操作方式等方面

1.DELETE  ・DML語言  ・可以回退  ・可以有條件的刪除 DELETE FROM 表名   WHERE 條件 2.TRUNCATE TABLE  ・DDL語言  ・無法回退

很精闢的oracle水位,終於知道DELETETRUNCATE為什麼不一樣了

一、Oracle表段中的高水位線HWM在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任

12_Delete不釋放水位的問題,與truncate對比實驗

Delete不釋放高水位線的問題,與truncate對比實驗Oracle高水位線 HWM對資料庫影響:1. 全表掃描通常要讀取直到HWM標記內,所有屬於該表資料庫塊,即使該表中沒有任何資料,這樣將耗費更多的I/O資源;2. 即使HWM以下有空閒的資料庫塊,鍵入在插入資料時使用

oracle 水位詳解(刪除大量資料後續處理)

一、oracle 高水位線詳解 一、什麼是水線(High Water Mark)? 所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞) 都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。這個HWM是一個標記,

降低oracle水位方法總結(包括驗證結果)

1. 執行表重建指令 alter table table_name move(驗證不可行,不降低水位線,但可釋放表空間) 當你建立了一個物件如表以後,不管你有沒有插入資料,它都會佔用一些塊,ORACLE也會給它分配必要的空間.同樣,用ALTER TABLE MOVE釋放自由空間後,還是保留了一些

斯坦福大學機器學習筆記——異常檢測演算法(斯分佈多元斯分佈異常檢測演算法)

異常檢測問題介紹: 異常檢測演算法主要用於無監督學習問題,但從某種角度看它又類似於一種有監督學習的問題,下面我們從一個例子中簡單介紹一下什麼是異常檢測問題。 比如我們有一個飛機引擎製造商,對於一個新造出的飛機引擎我們想判斷這個引擎是不是異常的。 假如我們有

揪出佔用磁碟空間的真凶!介紹一個好用的磁碟空間分析清理工具

電腦最近系統盤又告警變紅了,50G的空間已經用去了48G,使用了各種清理工具都不能清理出更大空間。我向一位前輩討教時,他介紹了一個工具給我:SpaceSniffer. SpaceSniffers是個磁碟空間分析工具,它能將磁碟上各個資料夾大小進行整理,讓我們看到哪些資料

重新啟動postgre報錯時,解決方案 ( 由備份檔案佔用空間太大造成 ) (linux 命令 df -h 檢視磁碟空間)

在這裡使用了一個liunx下的命令檢視磁碟空間 常用引數:df -h ------------------------------------- 1.在Linux下重新啟動postgre pg_ctl restart (postgres 使用者) 今天遇到的問題 由於匯

水位和全掃描

   高水位線好比水庫中儲水的水位線,用於描述資料庫中段的擴充套件方式。高水位線對全表掃描方式有著至關重要的影響。當使用delete 操作 表記錄時,高水位線並不會下降,隨之導致的是全表掃描的實際開銷並沒有任何減少。本文給出高水位線的描述,如何降低高水位線,以及高水 位線對

降低oracle水位方法總結

1. 執行表重建指令 alter table table_name move(驗證不可行,不降低水位線,但可釋放表空間)當你建立了一個物件如表以後,不管你有沒有插入資料,它都會佔用一些塊,ORACLE也會給它分配必要的空間.同樣,用ALTER TABLE MOVE釋放自由空間

DML -- 數據操縱預言: insert/delete/update --多連接修改/.多連接刪除/多連接查詢-- truncatedelete的區別

color _id friend 增長 code 方法 spa 全部 join /* DML -- 數據操縱預言: insert/delete/update */ #一: 插入語句 /* 語法1: insert into 表名(列名,..,列名....)

已知長度為n的線性A採用順序儲存結構,請寫一個時間複雜度為O(n)空間複雜度為O(1)的演算法,該演算法可刪除線性中所有值為item的資料元素。

語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq

Linux系統中查詢刪除重複檔案,釋放磁碟空間

在Linux系作業系統中查詢並刪除重複檔案的方法的確有很多,不過這裡介紹的是一款非常簡單實用的軟體FSlint。FSlint是一個重複檔案查詢工具,可以使用它來清除不必要的重複檔案,筆者經常使用它來釋放Linux系統中的磁碟空間。 FSlint同時具有GUI和CLI模式。因

oracle 刪除臨時以及truncatedelete的區別

oracle 刪除臨時表: 1、先truncate table table_name,釋放表儲存空間。 2、再delete table table_name ,刪除臨時表。 下面講一下truncate命令和delete的區別: 1、TRUNCATE在各種表上無論是大

建立刪除Oracle空間使用者的批處理命令

      介紹一下如何用批處理命令來建立、刪除Oracle資料庫的表空間和使用者。 1、一共要建立2個檔案如圖所示,一個是批處理檔案安裝.bat,一個是執行SQL命令的init.sql檔案。至於日誌.log是自動生成的檔案。 2、建立一個安裝.bat批處理:右擊新建t

mysql----快速刪除資料(drop,truncate.delete

概念:三者均可刪除資料表 TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌

mysql----快速刪除資料(drop,truncate,delete

概念: 三者均可刪除資料表 TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。 DELETE 語句每次刪除一行,並在事務