Oracle提高空間使用率的方法小結(jié)
一,行遷移和行鏈接
oracle盡量保證一行的數(shù)據(jù)能夠放在同一個數(shù)據(jù)塊當(dāng)中,有的時候行會發(fā)生行遷移和行鏈接。
行鏈接 :有一個列的字段是大對象(long,longlong)一行占的數(shù)據(jù)一整個塊都放不下,則oracle會把這行的數(shù)據(jù)分為兩部分或多部份,存放到不同的數(shù)據(jù)塊,這種現(xiàn)象叫做行鏈接。
行鏈接的缺陷顯而易見,原本我只需要找到一個塊就能找到所有數(shù)據(jù),現(xiàn)在可能讀更多的塊才能夠找到數(shù)據(jù),增加了io。
行遷移:原本的行在一個數(shù)據(jù)塊中,如果我們在這一行進(jìn)行了update操作,使得這一行的尺寸變大了
oracle在默認(rèn)情況下,如果這一行發(fā)生了增長,所需的多余空間會從這個塊的可用空間里面去獲取,這是最好的情況。但是如果這個塊可用的空間用滿了,則會發(fā)生行遷移。oracle會把這一行的數(shù)據(jù)遷移到一個新的數(shù)據(jù)塊,但是在原來的塊中會保留它的row id。
缺陷也是如此,原來只需要一次io,現(xiàn)在需要兩次io,降低了性能。
二,自動段空間管理(Auto Segment Space Management)
簡稱ASSM
段是oracle管理空間的一種機(jī)制
如果表空間是自動管理的,則會用到位圖管理機(jī)制。
BMB(bitmap blocks) 在一個段中會有很多個位圖塊,在位圖中記錄了對應(yīng)塊的信息,如(剩余空間,可用空間,這個機(jī)制使得管理更加靈活)
總結(jié)一下就是:我們給段分配很多數(shù)據(jù)塊,oracle會拿出一些數(shù)據(jù)塊來記錄這些數(shù)據(jù)塊的使用情況,這些數(shù)據(jù)塊叫做:BMB(位圖塊)。
三,oracle表空間分配類型
主要分為兩種方式:1.uniform(固定分配)。2.autoallocate(自動分配)
示例:
自動分配:
固定分配:
四,使用 unusable索引
如果把一個索引變成unusable,oracle會把這個索引段刪掉,但是保留索引的定義,節(jié)省了空間,以后需要時可以用rebuild重建索引。
五,使用臨時表
臨時表只有在事務(wù)和會話過程中存在數(shù)據(jù)。
如果我們以后為了測試。表中的數(shù)據(jù)有沒有無所謂,我們可以基于有數(shù)據(jù)的表建一個臨時表,我們在臨時表上面進(jìn)行測試,退出會話時oracle會把這個臨時表刪掉。
臨時表有兩種類型:
Global:建的臨時表的定義所有的會話都可見,內(nèi)容只有創(chuàng)建臨時表的會話看得見,其它會話不可見
Private:只有創(chuàng)建臨時表的會話可見,其它會話不可見。
臨時表的段只有在進(jìn)行第一次insert操作時才會分配,
創(chuàng)建全局臨時表:
插入數(shù)據(jù)后當(dāng)前會話可見,其它會話不可見。
on commit delete 關(guān)鍵字:當(dāng)事務(wù)提交,臨時表數(shù)據(jù)全部刪除。
創(chuàng)建私有臨時表:
注意:私有臨時表 ,表名必須以 ORA$PTT_開頭。
私有表前綴由private_temp_table_prefix 指定,可以自己指定
六,表壓縮
1.Basic table compression(基礎(chǔ)壓縮) 壓縮率:10倍
2.Advanced row compression(高級行壓縮) 壓縮率:2-4倍
壓縮原理:
Basic table compression 當(dāng)可用空間 是0 時觸發(fā)壓縮。
Advanced row compression 當(dāng)可用空間 剩余10% 觸發(fā)壓縮
例如:數(shù)據(jù)塊可用空間只剩下百分十10,觸發(fā)壓縮,把原來塊的數(shù)據(jù)進(jìn)行壓縮,騰出來一部分空間來存放新的數(shù)據(jù),再進(jìn)行insert操作后,可用空間又只剩下百分十10,再一次進(jìn)行壓縮。
總結(jié):oracle的壓縮原理是逐步壓縮。
basic壓縮:
空間大小比較:
注意如果使用 basic壓縮方式 使用insert方式進(jìn)行插入則不會進(jìn)行壓縮。
高級行壓縮:
不壓縮,插入數(shù)據(jù)十次:
insert into EMP_NOCMP select * from emp_nocmp; (重復(fù) 10 次)
高級行壓縮,插入數(shù)據(jù)十次:
insert into EMP_CMP select * from emp_cmp; (重復(fù) 10 次)
所占空間對比:
比較清晰,高級行壓縮所占空間明顯減少。
表壓縮缺陷:
打開計時器,對表進(jìn)行update操作,比對壓縮表和非壓縮表效率:
可見非壓縮表 update性能明顯高于壓縮表。
七,通過 shringking 操作回收空間
只能對段空間管理方式為ASSM方式的表空間使用。
如果塊中發(fā)生大量的delete操作,導(dǎo)致塊中的行不緊湊,浪費了大量塊空間,我們可以通過shringking 操作回收空間,降低高水位線,從而高水位線以上的塊就會被回收。
示例:創(chuàng)建一個表,表空間段空間管理為自動管理,即ASSM,插入十五次數(shù)據(jù)。
insert into emp_shr select * from emp_shr;(執(zhí)行15次)
查看數(shù)據(jù)字典,該表占用空間情況:
進(jìn)行刪除操作,導(dǎo)致出現(xiàn)空閑空間。
讓表允許移動行,否則無法使用shrink:
對表進(jìn)行shrink整理,查看數(shù)據(jù)字典。
發(fā)現(xiàn)此時空間并沒有被釋放,原因是我們的高水位線并沒有變低,只是把行變的緊湊了,沒有塊被oracle自動回收。
改變高水位線,讓高水位線以上的空閑塊被oracle回收。
此時,查看數(shù)據(jù)字典。
八,可恢復(fù)空間分配。
Oracle 數(shù)據(jù)庫服務(wù)器提供了一種暫停和稍后恢復(fù)執(zhí)行的方法空間分配失敗時的大型數(shù)據(jù)庫 操作。
簡而言之:假如我們的表空間大小不夠了,正常來說會直接報錯,假如我們執(zhí)行了兩個小時的inert操作,到最后因為表空間大小不足而導(dǎo)致操作失敗就很崩潰,所以oracle允許我們有補(bǔ)救措施。
resumable_timeout = 300;
假如我們的操作因為表空間大小不足,設(shè)置這個參數(shù)后不會立即報錯,而是會把這個事務(wù)掛起,在300s中,如果我們有補(bǔ)救措施,如resize表空間,增加了數(shù)據(jù)文件,使得表空間足夠進(jìn)行接下來的操作,該操作將繼續(xù)進(jìn)行。
如果300s之內(nèi)沒有補(bǔ)救,才會報錯,該操作失敗。
以上就是Oracle提高空間使用率的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Oracle提高空間使用率的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Oracle數(shù)據(jù)庫復(fù)雜度設(shè)置圖文教程
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫復(fù)雜度設(shè)置的相關(guān)資料,Oracle可以通過設(shè)置密碼復(fù)雜度來提高數(shù)據(jù)庫的安全性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04oracle數(shù)據(jù)庫sql的優(yōu)化總結(jié)
自己對oracle sql的一些優(yōu)化總結(jié),特分享下,方便需要的朋友2013-08-08Oracle 低權(quán)限數(shù)據(jù)庫賬戶得到 OS 訪問權(quán)限 提權(quán)利用
大概意思就是說,如果 ORACLE 服務(wù)是用 administrator 賬戶啟動的,你只要有一個具有 resource 和 connect 權(quán)限的數(shù)據(jù)庫賬戶,就能利用 metasploit 的 smbrelay 功能,本地搭建一個 SMB 欺騙服務(wù)器, 來得到系統(tǒng)的訪問權(quán)限。2009-06-06oracle數(shù)據(jù)庫添加或刪除一列的sql語句
需要注意的一點,如果要修改的表,不是當(dāng)前的用戶的表,那么就需要添加上用戶的名稱。以及有修改此表的權(quán)限2012-05-05Oracle的PDB數(shù)據(jù)庫創(chuàng)建DIRECTORY時遇到ORA-65254問題及解決方法
這篇文章主要介紹了Oracle的PDB數(shù)據(jù)庫創(chuàng)建DIRECTORY時遇到ORA-65254問題,本文給大家分享完美解決方案,需要的朋友可以參考下2023-06-06oracle中得到一條SQL語句的執(zhí)行時間的兩種方式
這篇文章主要介紹了oracle中如何得到一條SQL語句的執(zhí)行時間,有兩種可行方式,大家可以參考下2014-05-05