表空間是什么?表空間是數(shù)據(jù)庫(kù)的一種邏輯結(jié)構(gòu),它在物理上對(duì)應(yīng)著一個(gè)或多個(gè)數(shù)據(jù)文件。平常所講的表空間管理實(shí)際上指的是對(duì)表空間所對(duì)應(yīng)的數(shù)據(jù)文件的空間管理。
Oracle支持兩種管理方式,一種是字典管理(簡(jiǎn)稱(chēng)DMT),一種是本地管理(簡(jiǎn)稱(chēng)LMT)。這里所說(shuō)的管理方式是指針對(duì)extent的管理方式。
extent也是數(shù)據(jù)庫(kù)的一種邏輯結(jié)構(gòu),它包含一定數(shù)量的、連續(xù)的Oracle塊。它是Oracle的空間分配的最小單位。針對(duì)它的管理方式就是指表空間中的extent是如何被管理的(記錄extent的free、used使用情況)。
在這兩種管理方式中,字典管理方式是Oracle遺留的一種空間管理方式,它采用數(shù)據(jù)字典表UET$、FET$來(lái)記錄表空間中extent的使用情況。
每次進(jìn)行涉及空間管理的操作時(shí),都必須對(duì)這兩個(gè)表進(jìn)行維護(hù),其影響是顯而易見(jiàn)的。當(dāng)并發(fā)提高時(shí),該表上的爭(zhēng)用將無(wú)法避免被提高,同時(shí)將產(chǎn)生大量的undo占用大量系統(tǒng)回滾段,而且在字典管理方式下將產(chǎn)生令人頭痛的碎片問(wèn)題。
本地管理方式是從Oracle 8i開(kāi)始支持的一種管理方式,也是目前Oracle強(qiáng)烈建議采用的一種方式。它不再利用數(shù)據(jù)字典表來(lái)記錄空間使用情況,取而代之的是在數(shù)據(jù)文件頭部增加一個(gè)位圖區(qū),用位圖來(lái)記錄空間的使用情況,每一個(gè)bit都代表著一個(gè)extent的使用情況。
數(shù)據(jù)庫(kù)中如果不存在dmt類(lèi)型的表空間,則UET$和FET$中不再有信息。
表空間本身是和SQL語(yǔ)句運(yùn)行效率相關(guān)的,主要包括以下幾個(gè)方面:
對(duì)于DML語(yǔ)句來(lái)說(shuō),如果涉及空間的擴(kuò)展,需要有個(gè)分配的過(guò)程此時(shí),給用戶(hù)的體驗(yàn)就是SQL執(zhí)行速度很慢。
從Oracle 10g開(kāi)始,引入了一個(gè)等待事件“data fileinit write”來(lái)表示表空間擴(kuò)展時(shí)發(fā)生的等待。為Oracle需要將系統(tǒng)塊格式化為Oracle數(shù)據(jù)塊,然后才能提供數(shù)據(jù)庫(kù)使用。常見(jiàn)的優(yōu)化策略是在大規(guī)模的DML操作之前提前預(yù)分配空間的,這樣可避免臨時(shí)的空間擴(kuò)展導(dǎo)致的效率低下。
對(duì)于排序等操作,如果空間消耗較大,需要用到TEMP表空間。如果TEMP空間不足,會(huì)導(dǎo)致SQL語(yǔ)句執(zhí)行失敗。因此,對(duì)于TEMP表空間的使用要進(jìn)行監(jiān)控,對(duì)于耗費(fèi)TEMP較大的SQL需要重點(diǎn)關(guān)注,并進(jìn)行重點(diǎn)優(yōu)化。
985大學(xué) 211大學(xué) 全國(guó)院校對(duì)比 專(zhuān)升本