Oracle 資料庫整理表碎片
表碎片的來源
當針對一個表的刪除操作很多時,表會產生大量碎片。刪除操作釋放的空間不會被插入操作立即重用,甚至永遠也不會被重用。
怎樣確定是否有表碎片
-- 收集表統計資訊
SQL> exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');
[@more@]-- 確定碎片程度
SQL> 或者使用如下中的指令碼找出某個 Schema 中表碎片超過25%的表。使用此指令碼前,先確定 Schema 中表統計資訊收集完整。
SELECT table_name,
ROUND((blocks * 8), 2) "高水位空間 k",
ROUND((num_rows * avg_row_len / 1024), 2) "真實使用空間 k",
ROUND((blocks * 10 / 100) * 8, 2) "預留空間(pctfree) k",
ROUND((blocks * 8 - (num_rows * avg_row_len / 1024) -
blocks * 8 * 10 / 100),
2) "浪費空間 k"
FROM dba_tables
WHERE table_name = 'BP_RESERVE_ORDERLIST';
-- 檢視錶上次收集統計資訊時間
select table_name,last_analyzed from dba_tables where owner = 'SCHEMA_NAME'
-- 收集整個 Schema 中物件的統計資訊
SQL> exec dbms_stats.gather_schema_stats(ownname=>'SCHEMA_NAME');
為什麼要整理表碎片
Oracle 對資料段的管理有一個高水位(HWM, High Water Mark)的概念。高水位是資料段中使用過和未使用過的資料塊的分界線。高水位以下的資料塊是曾使用過的,以上的是從未被使用或初始化過的。
當 Oracle 進行全表掃描(FTS, Full table scan)的操作時,它會讀高水位下的所有資料塊。如果高水位下還有很多空閒空間(碎片),讀取這些空閒資料塊會降低操作的效能。
行連結和行遷移
- 行連結 Row Chaining:當插入資料量大的行的,如果一個Block不能存放一條記錄,該記錄的一部分會儲存到同個Extent中的其他Block,這些block形成一個資料塊鏈。
- 行遷移 Row Migration:當Update的時候導致記錄長度增加了,儲存的Block已經滿了,就會發生行遷移。Oracle會遷移整行資料到一個能夠儲存下整行資料的Block中,遷移的原始指標指向新的存放行資料的Block,ROWID不變。
當資料行發生連結(chain)或遷移(migrate)時,對其訪問將會造成 I/O 效能降低,因為Oracle為獲取這些資料行的資料,必須訪問更多的資料塊(data block)。
表碎片導致的問題
- 查詢響應時間(尤其是全表掃描)變慢
- 產生大量行遷移
- 浪費空間
整理表碎片對基於索引的查詢不會有太大效能提升。
如何整理表碎片
10g之前
兩種方法:
- 匯出表,刪除表,再匯入表
- alter table move
一般選擇第二種,需要重建索引。
10g後
從 10g 開始,提供一個 shrink 命令,需要表空間是基於自動段管理的。
可以分成兩步操作:
-- 整理表,不影響DML操作
SQL> alter table TABLE_NAME shrink space compact;
-- 重置高水位,此時不能有DML操作
SQL> alter table TABLE_NAME shrink space;
也可以一步到位:
-- 整理表,並重置高水位
SQL> alter table TABLE_NAME shrink space;
shrink 的優勢:
- 不需要重建索引。
- 可以線上操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156834/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫表碎片整理Oracle資料庫
- Oracle資料表碎片整理Oracle
- 「Oracle」Oracle 資料庫安裝Oracle資料庫
- Oracle資料庫配置Oracle資料庫
- SQL server資料庫表碎片比例查詢語句SQLServer資料庫
- oracle資料庫與oracle例項Oracle資料庫
- 「Oracle」Oracle資料庫基本概念Oracle資料庫
- 「Oracle」Oracle 資料庫基本概念Oracle資料庫
- Oracle資料庫-----資料庫的基本概念Oracle資料庫
- oracle 備份資料庫,匯出資料庫Oracle資料庫
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 4.2. Oracle資料庫Oracle資料庫
- Laravel 使用 Oracle 資料庫LaravelOracle資料庫
- oracle資料庫卡頓Oracle資料庫
- Oracle資料庫閃回Oracle資料庫
- oracle資料庫資料字典應用Oracle資料庫
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫
- 伺服器資料恢復—透過拼接資料庫碎片恢復SqlServer資料庫資料的資料恢復案例伺服器資料恢復資料庫SQLServer
- Oracle資料庫遷移至PolarDb(阿里雲資料庫)Oracle資料庫阿里
- 「Oracle」Oracle 資料庫備份還原Oracle資料庫
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- oracle資料庫建立資料庫例項-九五小龐Oracle資料庫
- oracle資料庫的impdp,expdpOracle資料庫
- Oracle資料庫語句大全Oracle資料庫
- Oracle資料庫跟蹤SQLOracle資料庫SQL
- Oracle 資料庫打包安裝Oracle資料庫
- Access 匯入 oracle 資料庫Oracle資料庫
- 清理oracle資料庫空間Oracle資料庫
- oracle資料庫%notfound的理解Oracle資料庫
- oracle資料庫調優描述Oracle資料庫
- Oracle:容器資料庫簡介Oracle資料庫
- Python 連線 Oracle資料庫PythonOracle資料庫
- oracle資料庫常用語句Oracle資料庫
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- Oracle資料庫管理——表資料庫高水位及shrink操作Oracle資料庫
- Oracle資料庫(資料泵)遷移方案(上)Oracle資料庫
- Oracle資料庫(資料泵)遷移方案(下)Oracle資料庫