《數據庫系統概念》12-文件的組織

一個數據庫被映射到多個不一樣的文件,這些文件由底層的操做系統來維護。每一個文件分紅定長的存儲單元,稱爲塊(bolck),塊是存儲分配和數據傳輸的基本單元。數據庫默認的塊在4-8k之間。一般沒有記錄比塊更大(圖片音頻等大文件先不考慮),此外還要求每條記錄保存在單個塊中。數據庫

 

1、定長記錄
instructor表的屬性有:ID char(5); name char(20)。假設每一個字符佔用1字節,則每條記錄佔用25字節,不能將這些記錄順序存儲,不然會出現跨塊的狀況;並且刪除記錄時,將後面的記錄依次向前移動開銷很大。爲了解決跨塊的問題,每一個塊只存儲整數條記錄,多餘的空間暫時不用。而在刪除記錄時,能夠將最後一條記錄移動到被刪除記錄的位置,而不是將全部後面的記錄依次向前移動。此外考慮到插入操做每每比刪除操做更爲頻繁,能夠將刪除記錄後留出的空間給下次的插入數據佔用。
但插入記錄時,如何找到被刪除記錄的位置呢:能夠在文件頭部留出必定空間來存儲第一條被刪除記錄的位置,第二條記錄被刪除後,其位置被記錄在第一條刪除記錄的位置,這樣依次進行,造成了圖示的狀況:學習

被刪除的記錄造成了一條鏈表(linked list),這兒也稱爲空閒列表(free list)。每次新插入數據時,都插入header指向的地址,同時header中的地址更新爲下一條被刪除記錄的地址。操作系統

 

2、變長記錄3d

A)存儲方式
數據表中包含變長屬性時就會涉及到變長記錄的存儲。無論何種變長存儲技術,都須要解決這兩個基本問題:如何描述一條記錄,能夠方便地獲取其中的屬性;如何在塊中存儲一條記錄,能夠使它被方便地獲取到。
一條有變長屬性的記錄一般具備兩部分:定長的初始部分,而後是緊隨其後的變長部分。定長部分用(偏移量,長度)這樣的格式來表示,偏移量指示了數據的起始位置,長度即爲變長部分的長度。變長部分在定長部分以後連續存儲。指針

上圖示例爲instructor(ID varchar(5);name varchar(20);dept_name varchar(20);salary numeric(8,2))的存儲方式,ID name dept_name是變長的(假定偏移量、長度分別佔用2個字節);salary是定長的,因此直接存儲。
上圖也演示了空位圖(null bitmap)的使用,若是屬性salary是空的,則空位圖的第4位會被置爲1,存儲salary的12-19位會被忽略。1字節的空位圖能夠應對最多8個屬性的表結構,若是有更多屬性,則須要擴展空位圖的長度。這種方式以額外的空位圖讀取爲代價,節約了存儲空間,在具備不少屬性同時這些屬性多爲空的表中是頗有效的。blog

 

B)在塊中存儲變長記錄
在塊中存儲變長記錄時通常使用分頁的槽結構(slotted-page structure),如圖所示,每一個塊(block)中都有header:圖片

header中包含的信息有:塊中條目的個數、空閒空間的結尾處、每條記錄的入口(entry,包含記錄位置和大小)。記錄在塊中連續存儲,可是,是從塊的尾部開始存起的。每次插入新的紀錄時,就放置在空閒空間的末尾,同時在header中保存這條記錄的入口信息;當刪除一條記錄時,被刪除記錄前的記錄依次前後移動,以佔據被刪記錄的空間。因爲每一個塊的體積在4-8k之間,並不算太大,因此這種移動的開銷相對較小。在分頁的槽結構中,數據指針不是直接指向數據,而是指向數據的入口(entry),因而數據在塊中能夠任意被移動,這能夠避免塊中碎片的產生。it

 

學習資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan學習資料

相關文章
相關標籤/搜索