天天看點

concepts 閱讀總結2——存儲

1、可用空間管理:

首先說明這裡的可用空間和塊中的“可用空間區”不是一個概念,這裡是指段裡的沒有被用的可用空間,段内已用與可用空間以位圖(bitmap)的形式記錄,但是可用塊是以另外一種位圖的形式管理的,注意區分。

段空間自動管理(Automatic segment-space management)具備以下優勢:

易于使用

空間利用效率更高,尤其針對每行資料容量差異大的表(或其他對象)

能夠更好地針對目前資料的情況實時調整

Better multi-instance behavior in terms of performance/space utilization

使用者在建立表空間的時候就可以指明選擇 段空間自動管理(Automatic segment-space management),這樣在這個表空間内的段都會使用自動段空間管理。

有兩種sql語句可以增加可用空間的大小,分别是delete和update(修改的更小的時候);這兩種操作釋放的空間可以被後續的insert語句使用:

*如果insert語句和上述操作位于同一個事物,且在上述操作之後,那麼空間可以被直接使用。

*如果insert語句和上述操作不位于同一事物,那隻能等到釋放空間的語句送出,且插入語句正好用到此處的剛剛釋放的空間,那才可以用。

資料塊(data block)中被釋放出的空間未必與可用空間區(free space)相連續。Oracle在滿足以下條件時才會将釋放的空間合并到可用空間區:(1)INSERT 或 UPDATE語句選中了一個有足夠可用空間容納新資料的資料塊,(2)但是此塊中的可用空間不連續,資料無法被寫入到資料塊中連續的空間裡。Oracle隻在

滿足上述條件時才對資料塊中的可用空間進行合并,這樣做是為了避免過于頻繁的空間合并工作影響資料庫性能。

行連結與行遷移: 有兩種情況會導緻表中的行的資料量過大,一個行無法容納,當資料塊内插入資料量大的資料類型的行時,就像long ,或者long raw,此時行連接配接不可避免,這時oracle将這行資料存儲在這個段的多個塊中,并連結起來。

第二種情況就是原本存在一個塊中的資訊,由于新插入的資料行過大,即使把這個塊全部填滿也裝不下,這樣我們可以把這個塊的資料行遷移到另一個塊中,但是要保證原來資料塊上有一個指向新資料塊的指針,并且資料行的rowid保持不變。

手動空間管理(manually managed tablespaces)

在手動管理的表空間(manually managed tablespaces)中,使用者可以使用 PCTFREE 和PCTUSED 這兩個存儲管理參數來控制對某段(segment)進行插入和更新操作時,如何利用屬于此段的資料塊(data

block)中的可用空間。使用者也可以在建立或修改索引時為其設定 PCTFREE 參數(索引存儲在索引段(index segment)中)。

2、資料擴充概述和管理:

當使用者建立資料表時,Oracle為此表的資料段(data segment)配置設定一個包含若幹資料塊(data block)的初始資料擴充(initial extent)。雖然此時資料表中還沒有資料,但是在此初始資料擴充中的資料塊已經為插入新資料做好了準備。如果一個段(segment)的初始資料擴充(initial

extent)中的資料塊(data block)都已裝滿,且有新資料插入需要空間時,Oracle自動為這個段配置設定一個增量資料擴充(incremental extent)。增量資料擴充是一個段中繼已有資料擴充之後配置設定的後續資料擴充,她的容量大于或等于之前的資料擴充。

為了管理的需要,每個段(segment)的段頭(header block)中包含一個記錄此段所有資料擴充(extent)的目錄。

每個段的定義中還包括了資料擴充的存儲參數,這個參數控制着如何為段配置設定可用的空間。。

例如,使用者可以在 CREATE TABLE 語句中使用 STORAGE 子句設定存儲參數,決定建立表時為其資料段(data segment)配置設定多少初始空間,或限定一個表最多可以包含多少資料擴充。如果使用者沒有為表設定存儲參數,那麼表在建立時使用所在表空間(tablespace)的預設存儲參數。

使用者既可以使用資料字典管理的表空間(dictionary managed tablespace)(依賴資料字典表監控空間的利用情況),也可以使用本地管理的表空間(locally managed tablespace)(使用位圖(bitmap)來标記可用與已用空間)。由于本地管理的表空間性能較好且易于管理,當使用者沒有顯式地設定資料擴充(extent)管理參數時,除了 SYSTEM之外的所有永久表空間(permanent

tablespace)預設使用本地管理方式。

在一個本地管理的表空間中,其中所配置設定的資料擴充(extent)的容量既可以是使用者設定的固定值,也可以是由系統自動決定的可變值。當使用者建立表空間(tablespace)時可以使用 UNIFORM (使用者指定)或 AUTOALLOCATE (由系統管理)子句設定資料擴充的配置設定方式。

對于固定容量(UNIFORM)的資料擴充,使用者可以為資料擴充設定容量或使用預設大小(1 MB)。使用者須確定每個資料擴充的容量至少能包含5個資料塊(database block)。本地管理(locally managed)的臨時表空間(temporary tablespace)在配置設定資料擴充時隻能使用此種方式。

對于由系統管理(AUTOALLOCATE)的資料擴充,由Oracle決定新增資料擴充的最佳容量,其最小容量為 64 KB。如果建立表空間時使用了“segment space management auto”子句,且資料塊容量大于等于 16 KB,Oracle擴充一個段時(segment)所建立的資料擴充的最小容量為 1 MB。對于永久表空間(permanent tablespace)上述參數均為預設值。

資料拓展的配置設定和回收:

oracle會根據表空間管理的方式不同(分為兩中表空間管理的方式:資料字典管理(dictionary manage tablespace)和本地管理(localhost managed tablespace))選擇不同的資料擴充的配置設定算法。

  對于常用的本地管理,oracle在配置設定資料拓展的時候,首先-選擇一個屬于此表空間的資料檔案,再搜尋此資料檔案的位圖,查找連續的資料塊,如果此資料檔案中有連續的資料塊空間可用,則配置設定,否則找下一個資料檔案。

一般來說,在使用者将一個段(segment)對應的方案對象(schema object)移除(使用DROP TABLE 或 DROP CLUSTER 語句)之前,此段的資料擴充(extent)不會被回收到表空間(tablespace)中,但是以下情況例外:

表,簇表的所有者(owner)或擁有 DELETE ANY 權限的使用者, 可以使用TRUNCATE...DROP STORAGE 語句将表,簇表的資料清除

DBA 可以使用以下文法收回一個段中未使用的資料擴充:

ALTER TABLE table_name DEALLOCATE UNUSED;

如果使用者為復原段(rollback segment)設定了 OPTIMAL 參數,Oracle将周期性地從其中回收資料擴充。

當資料擴充(extent)被釋放後,Oracle修改資料檔案(datafile)中的位圖(bitmap)(對于本地管理的表空間)或更新資料字典(對于資料字典管理的表空間),将回收的資料擴充視為可用空間。被釋放的資料擴充中的資料無法繼續通路。

3、資料塊的結構:

concepts 閱讀總結2——存儲

資料塊頭:(包括标準内容和可内容)一般是此資料塊的位址(block address) 和

此資料塊所屬段的類型(是表呢?還是索引呢?)

表目錄區:如果一個表在這個資料塊中存儲了資料行,那麼這個表目錄區就記錄了這個表的資訊。

行目錄區:此區域包含了每個資料行(或者一個行的片段,因為或許這個行非常的長,直接把這個塊用沒了還沒有完)的位址;還有一個事,就是如果行資料區的所有資料被删了,但是行目錄區的内容是不會跟着被删除的,直到下一次這個塊被寫入資料時,行目錄區才會被重新利用寫入。

資料塊頭(data block header),表目錄區(table directory),行目錄區(row directory)被統稱為管理開銷(overhead)。其中 有些開銷的容量是固定的;而有些開銷的總容量是可變的。資料塊中固定及可變管理開銷的容量平均在84到107位元組(byte)之間。

在新配置設定的資料塊中,用于插入的資料塊空間的容量等于資料塊的大小減去資料塊頭的大小再減去預留的可用空間(PCTFREE);但是用于更新的資料空間是比用于插入的資料空間大的,因為PCTFREE留出來的空間就是用來做更新的

,也就是說,可以是用pctfree裡面的空間。

對于老版本的手動段空間管理,使用的是連結清單的方式管理,使用者可以使用 PCTFREE 和PCTUSED 這兩個存儲管理參數來控制對某段(segment)進行插入和更新操作時,如何利用屬于此段的資料塊(data

block)中的可用空間。

在一個資料段或者索引段中,oracle管理着一個或者多個可用塊清單(在一個段中使用多個可用塊清單,可以避免并行插入操作引發的資料塊争用),其中這些清單列出了屬于這個段的所有的資料擴充中可用空間比例大于PCTFREE的的資料塊,這些資料塊可以被用來insert資料。當插入一行資料的時候,oracle從清單中提取出第一個可用的資料塊,如果插入的資料比可用的容量還要大,那就裝不進去了,此時看塊内的資料量是否大于PCTUSED,如果大于,oracle就把此塊從可用清單中移除,如果小于,則等待下次繼續使用。

當執行了delete或者update後,并且做了送出,這時oracle會檢查相關的資料塊容量是不是變得小于PCTUSED的要求了,如果小于,那這些塊就會被優先放在這個事務所使用的可用塊清單中,供這個事務下面的操作使用,該事務送出後,這些塊也可以被其他事務繼續使用。。。

關于塊的了解,轉載了一篇文章:

<a href="http://blog.csdn.net/changyanmanman/article/details/7265844">http://blog.csdn.net/changyanmanman/article/details/7265844</a>