溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle 數(shù)據(jù)庫整理表碎片

發(fā)布時間:2020-08-08 00:37:33 來源:ITPUB博客 閱讀:172 作者:Davis_itpub 欄目:關(guān)系型數(shù)據(jù)庫

表碎片的來源

當(dāng)針對一個表的刪除操作很多時,表會產(chǎn)生大量碎片。刪除操作釋放的空間不會被插入操作立即重用,甚至永遠也不會被重用。

怎樣確定是否有表碎片

-- 收集表統(tǒng)計信息

SQL> exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');

[@more@]

-- 確定碎片程度

SQL> 或者使用如下gist中的腳本找出某個 Schema 中表碎片超過25%的表。使用此腳本前,先確定 Schema 中表統(tǒng)計信息收集完整。

SELECT table_name,

ROUND((blocks * 8), 2) "高水位空間 k",

ROUND((num_rows * avg_row_len / 1024), 2) "真實使用空間 k",

ROUND((blocks * 10 / 100) * 8, 2) "預(yù)留空間(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';

-- 查看表上次收集統(tǒng)計信息時間

select table_name,last_analyzed from dba_tables where owner = 'SCHEMA_NAME'

-- 收集整個 Schema 中對象的統(tǒng)計信息

SQL> exec dbms_stats.gather_schema_stats(ownname=>'SCHEMA_NAME');

為什么要整理表碎片

Oracle 對數(shù)據(jù)段的管理有一個高水位(HWM, High Water Mark)的概念。高水位是數(shù)據(jù)段中使用過和未使用過的數(shù)據(jù)塊的分界線。高水位以下的數(shù)據(jù)塊是曾使用過的,以上的是從未被使用或初始化過的。

當(dāng) Oracle 進行全表掃描(FTS, Full table scan)的操作時,它會讀高水位下的所有數(shù)據(jù)塊。如果高水位下還有很多空閑空間(碎片),讀取這些空閑數(shù)據(jù)塊會降低操作的性能。

行鏈接和行遷移

  • 行鏈接 Row Chaining:當(dāng)插入數(shù)據(jù)量大的行的,如果一個Block不能存放一條記錄,該記錄的一部分會存儲到同個Extent中的其他Block,這些block形成一個數(shù)據(jù)塊鏈。
  • 行遷移 Row Migration:當(dāng)Update的時候?qū)е掠涗涢L度增加了,存儲的Block已經(jīng)滿了,就會發(fā)生行遷移。Oracle會遷移整行數(shù)據(jù)到一個能夠存儲下整行數(shù)據(jù)的Block中,遷移的原始指針指向新的存放行數(shù)據(jù)的BlockROWID不變。

當(dāng)數(shù)據(jù)行發(fā)生鏈接(chain)或遷移(migrate)時,對其訪問將會造成 I/O 性能降低,因為Oracle為獲取這些數(shù)據(jù)行的數(shù)據(jù),必須訪問更多的數(shù)據(jù)塊(data block)。

表碎片導(dǎo)致的問題

  • 查詢響應(yīng)時間(尤其是全表掃描)變慢
  • 產(chǎn)生大量行遷移
  • 浪費空間

整理表碎片對基于索引的查詢不會有太大性能提升。

如何整理表碎片

10g之前

兩種方法:

  • 導(dǎo)出表,刪除表,再導(dǎo)入表
  • 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 的優(yōu)勢:

  • 不需要重建索引。
  • 可以在線操作。
不需要空閑空間,alter move需要跟當(dāng)前表一樣大小的空閑空間。
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI