目錄
第十章 存儲和文件結構
10.1 物理存儲介質概述
按照訪問的數據的速度、購買介質的每單位數據的成本、以及介質的可靠性分類:
10.2 磁盤和快閃存儲器
10.2.1 磁盤的物理特性
磁盤的物理結構:
磁盤控制器(disk controller)是計算機系統和實際的磁盤驅動器硬件之間的接口。
磁盤控制器在磁盤驅動單元的內部實現。它接受高層次的讀寫扇區的命令,然後開始動作,如:移動磁盤臂尋找到正確的磁道,並實際的讀寫數據。
磁盤控制器爲它所寫的每個扇區附加校驗和(checksum),校驗和是從寫到三區的數據計算得到的。
- 當讀取一個扇區時,磁盤控制器會對讀到的數據計算校驗和,並把它與存儲的校驗和做比較
- 如果數據被破壞,則檢驗和不一致的概率就很高。
- 如果發生這種錯誤,磁盤控制器會重讀幾次。如果錯誤繼續發生,則它會發出一個讀操作失敗的信號。
壞扇區的重映射(remapping of bad sector)
磁盤控制器還能夠進行壞扇區的重映射。當磁盤初始格式化/試圖讀取一個扇區時,如果磁盤控制器檢測到一個損壞的扇區,它會把這個扇區在邏輯上映射到另一個物理位置。重映射記錄在磁盤或非易失性存儲器中,而寫操作在新的位置執行。
磁盤通過高速互聯通道連接到計算機系統,通用的將磁盤連接到計算機的接口有:
- SATA,也叫串行ATA(Serial ATA)
- 小型計算進系統互聯(Small-Computer-System Interconnect, SCSI)
- SAS,也叫串行附着SCSI(serial attached SCSI)
- 光纖通道接口(Fibre Channel Interface)
磁盤可以通過電纜直接與計算機系統的磁盤接口相連,也可以通過高速網絡將遠端磁盤與磁盤控制器相連。
存儲局域網(Storage Area Network, SAN)體系結構:
在SAN中,大量的磁盤通過高速網絡與許多計算機服務器相連。通常磁盤採用獨立冗餘陣列(Redundant Array of Independent Disk, RAID)技術進行本地化組織,從而給服務器一個很大且非常可靠的磁盤的邏輯視圖。SAN意味着磁盤可以由並行運行一個應用程序的不同服務器所共享。
網絡附加存儲(Network Attached Storage,NAS)
由SAN發展而來。NAS和SAN類似,但是它通過使用網絡文件系統協議(如NFS或CIFS)提供文件系統接口,而不是你看似一張大磁盤的網絡存儲器。
10.2.2 磁盤性能的度量
磁盤質量的主要度量指標:容量,訪問時間,數據傳輸率,可靠性。
10.2.3 磁盤塊訪問的優化
磁盤I/O請求是由文件系統和大多數操作系統具有的虛擬內存管理器產生。
每個請求指定了要訪問的磁盤地址,即:塊號。
磁盤的連續請求可分爲兩類:。
- 順序訪問(sequantial access)模式:連續的請求會請求處於相鄰的磁道或者相鄰的磁道上連續的塊。順序訪問中只有讀取第一個塊時需要尋道,後續的請求不需要尋道。
- 隨機訪問模式(random access)模式:相繼的請求會請求那些隨機位於磁盤上的塊,每一次請求都需要一次磁盤尋道。一張磁盤在每秒能夠滿足的隨機塊訪問的數量取決於尋道時間。
提高訪問塊的速度的技術:
緩衝 buffering |
從磁盤讀取的塊暫時存儲在內存緩衝區中,以滿足將來的需求。 緩衝區通過操作系統和數據庫系統共同運作。 |
預讀 read-ahead |
當一個磁盤塊被訪問時,相同磁道的連續塊也被讀入內存緩衝區,即便美原油針對這些塊的即將來臨的請求。 - 能夠提高順序訪問的請求處理速度;但是對隨機塊訪問不是很有效。 |
調度 scheduling |
磁盤臂調度算法(disk-arm scheduling)試圖把對磁道的訪問按照能增加可以處理的訪問數量的方式排序。 通常用的算法有電梯算法(elevator algorithm):磁盤控制器對請求進行重新排序,因爲它最清楚磁盤塊的組織、盤片的旋轉位置和磁盤臂的位置。電梯算法是從內到外-再從外到內的移動,在每條有請求的磁道上停下並提供服務。 |
文件組織 file organization |
爲了減少訪問塊的時間,可以按照與預期的數據訪問方式最接近的方式來組織磁盤上的塊。 例如:WIndows和Unix OS,對用戶隱藏磁盤組織,並由OS內部管理空間的分配。它們爲一個文件分配一個或多個連續的塊==>保證順序文件訪問只需尋道一次。過段時間,文件可能變得碎片化(fragmented),此時,OS可以對磁盤上的數據進行一次備份,然後再恢復整張磁盤。恢復操作將每個文件的塊連續的寫會。 |
非易失性寫緩衝區NV-RAM Non Volatile Random-Access Memory |
主存中的內容在發生電源故障時將全部丟失,所以數據庫的更新必須記錄到磁盤上,這樣才能再崩潰時保存。 更新密集的數據庫應用的性能取決於磁盤寫操作的速度。
NV-RAM大幅度加快了寫磁盤的操作速度。 NV-RAM的內容在發生故障時不會丟失,一種實現方式是使用有備用電池的RAM。其思想是: 數據庫系統請求往磁盤上寫一個塊時---磁盤控制器將這個塊寫到NV-RAM緩衝區,然後立刻通知寫操作已經完成---當磁盤沒有其他請求,或者NV-RAM緩衝區已滿時,磁盤控制器將這些數據寫到磁盤上相應的目標地址。
只有當NV-RAM已滿時,數據庫的寫請求才會有延時。
從系統崩潰中恢復時,NV-RAM中所有緩衝區未完成的內容將會寫回到磁盤上。 |
日誌磁盤 log disk |
日誌磁盤,即專門用於寫順序日誌的磁盤,是減少寫等待的另一種方法。 對日誌磁盤的所有訪問都是順序的,這從根本上消除了尋道時間。 與NV-RAM類似,所有操作都在日誌磁盤中記錄,數據庫系統不用等待操作的完整,日誌磁盤會在以後完成寫操作。日誌磁盤可以最小化磁盤臂的移動而重排寫操作的順序。
如果系統在實際磁盤寫操作完成前崩潰,則系統恢復後,可以讀取日誌磁盤,完成那些還沒有完成的操作。
支持上述日誌磁盤的文件系統稱爲日誌文件系統(journaling file system) |
10.2.4 快閃存儲
快閃存儲器一共有兩種:
- NOR快閃:允許隨機訪問閃存中的單個字,並且擁有和主存可以媲美的讀取速度。
- NAND快閃:與NOR不同,它的讀取是將整個數據頁(page)從NAND快閃取到主存儲器中,該page包括大概512-4096字節的數據。page與之前的extent的概念類似。NAND比NOR更便宜,並且擁有高速的存儲容量,目前使用廣泛。
NAND構建的存儲系統提供與磁盤存儲器相同的面向塊的接口。
相對於磁盤,NAND的優點有:
- 提供更快的隨機存取
- 雖然閃存的傳輸速率(通常爲20MB/s)比磁盤低,但是固態驅動器可並行的使用多塊閃存芯片,將傳輸速率提高到200M/s,這比大多數磁盤要快。
NAND的缺點:
- 寫入比較複雜。寫一個閃存頁面通常要幾微秒。
- 一旦寫入,不能直接覆蓋,只能先擦除,在重寫。
- 一個閃存頁面可擦除的次數存在限制,通常約爲10萬-100萬次。一旦達到限制,在存儲位可能會發生錯誤。
閃存轉換層(flash translation layer)
混合硬盤驅動器(Hybrid Disk Drive):
它結合了小容量閃存存儲器的硬盤系統,對頻繁訪問的數據,該驅動器作爲緩存使用。頻繁訪問但很少更新的數據最適合存儲域閃存存儲器中。
10.3 RAID
10.3.1 通過冗餘提高可靠性
N張磁盤組成的集合中某張磁盤發生故障的概率會比特定的以一張磁盤發生的概率要高。
引入冗餘(redundancy)是解決這個可靠性問題的方法。冗餘對發生故障時重建信息。
實現冗餘最簡單的方式是:複製每一張磁盤。這種技術稱爲鏡像(mirroring)。
- 一張邏輯磁盤由兩張物理磁盤組成,並且每月一次寫操作都要在兩張磁盤上執行。如果其中一張磁盤發生了故障,數據可以從另一張磁盤讀出。只有兩張磁盤都發生故障,數據纔會丟失。
- 一般情況下,先寫一個磁盤,再對另一個進行拷貝。
10.3.2 通過並行提高性能
磁盤鏡像可以使得我們對多張磁盤進行並行訪問,提高訪問速度。
此外,也可以採用數據拆分(Striping Data)提高傳輸速率。有不同層次的數據拆分形式,如:塊級拆分和比特級拆分等。其中塊級拆分是最常用的數據拆分。
- 比特級拆分(Bit-Level Striping):將每個字節按照比特拆分,存儲到多個磁盤上。
- 例如:有一個由8張磁盤組成的陣列,將每個字節的第i位存儲到第i張磁盤,這8張磁盤陣列可以被看成單一的磁盤。這張大磁盤的一個扇區的大小是通常大小的8倍。它的傳輸速率也是通常的8倍。每張磁盤都參與每次的訪問,每次讀取的數據量是一張磁盤上的8倍。位級別的拆分可以推廣到磁盤綜述爲8的整數倍或8的因子情況,如使用4張磁盤,則第第i位和第i+4位可以寫到第i章磁盤上。
- 塊級別的拆分(Block-Level Striping):將塊拆分到多張磁盤上。假設有n張磁盤,則將第i塊存儲到第(i mod n)+1張磁盤上。塊級拆分也提高了數據的傳輸速率。
磁盤中的並行主要有兩個目的:
- 負載平衡多個小的操作(塊訪問),以提高這種訪問操作的吞吐量。
- 並行執行大的訪問操作,以減少大的訪問操作的響應時間。
10.3.3 RAID級別
RAID,Redundant Array of Independent Disk, 獨立磁盤冗餘陣列。
除了磁盤鏡像,奇偶校驗結合磁盤拆分思想也可以實現冗餘。
結合奇偶校驗位、磁盤拆分思想、以及磁盤鏡像,並對成本和性能進行權衡,提供了多種不同的冗餘替代方案,並且分爲RAID級別。下圖中P表示糾錯位,C表示數據的拷貝。
RAID 0: 無冗餘拆分 |
塊級拆分,無任何冗餘的磁盤陣列。圖10-3(a)提供了大小爲4的磁盤陣列 |
RAID 1: 鏡像磁盤 |
使用塊級拆分的磁盤鏡像。爲每個磁盤提供一個鏡像備份。 |
RAID 2: 內存風格的糾錯碼 |
也稱爲內存風格的糾錯碼(Error-Correcting-Code, ECC)組織結構。 通過結合字節拆分分散存儲在多張磁盤上,可以直接在磁盤陳列上使用奇偶校驗位。 10-3(c)顯示了RAID2級方案,標記P存儲了糾錯位。如果一張磁盤發生故障,可通過其餘位+糾錯碼來重建數據。
奇偶校驗: 內存系統的每個字節都有一個與之相關的奇偶校驗位,它記錄了這個字節中爲1的位數是偶數(奇偶校驗位=0)還是奇數(奇偶校驗位=1)。如果其中一位被破壞,那麼奇偶校驗位就會改變,而與存儲的奇偶校驗位不匹配。同樣,我們也可以發現存儲的奇偶校驗位的改變。 通過奇偶校驗位內存可以檢測到所有1位的錯誤。
糾錯碼機制存儲兩個或更多的附加位,並且如果有一位被破壞,它可以重建數據。 |
RAID 3: 位交叉奇偶校驗 |
位交叉的奇偶校驗組織結構。在RAID2級的基礎上進行改進。 因爲磁盤存儲器可以檢測到一個扇區是否正確地讀出,所以可以使用一個唯一的奇偶校驗位來檢測和糾錯。 其思想: 如果一個扇區被破壞,系統能夠準確的知道是哪個扇區壞了,並對扇區中的每一位,通過計算其他磁盤上對應扇區的對應位的奇偶值來推斷出該扇區是1還是0。如果其餘位的奇偶校驗位等於存儲的奇偶校驗位,則丟失的位是0,反之是1。
RAID3級比RAID2級優於節省了存儲空間。 RAID3級比RAID1級的優勢: - 減少了存儲的開銷 - RAID3使用N道數據拆分,所以對每個字節的讀寫散步在多張磁盤中,所以傳輸率是RAID1級的N倍;但另一方面每個磁盤都要參與到I/O請求中,所以它每秒鐘支持的I/O操作數要少。 |
RAID 4: 塊交叉奇偶校驗 |
它也是用塊級拆分,此外在一張獨立的磁盤上爲其他N張磁盤上對應的塊保留一個奇偶校驗位。如果一張磁盤發生故障,可以用其他磁盤對應的塊和奇偶校驗塊進行數據重建。
它讀取一個塊時只訪問一張磁盤,因此允許其他的請求在其他磁盤上執行==>每個訪問的數據傳輸率較低,但是可以並行的執行多個讀操作,產生較高的I/O傳輸率。
由於所有磁盤都可以並行的讀,所以讀取大數據和寫入大數據時,傳輸率很高,因爲奇偶校驗也可以並行操作。
對於小數據的寫入不能並行執行。寫一個塊需要執行以下2次舊值讀取和2次新值寫入操作:讀取存儲這個塊的磁盤+存儲奇偶校驗位的磁盤;寫入這個塊+更新奇偶校驗位。 |
RAID 5: 塊交叉的分佈奇偶校驗 |
塊交叉的分佈奇偶校驗位的組織結構。在RAID4上進行改進,將數據和奇偶校驗位分佈到所有的N+1張磁盤中,而不是N張磁盤存數據,1張存儲奇偶校驗位。 如下圖所示, P0是 其餘四個塊的奇偶校驗塊;每張磁盤都存儲了其他四張磁盤對應位置的奇偶校驗塊。 注意:奇偶校驗塊不能和其所對應的數據庫存儲在同一磁盤下。否則可能會同時丟失二者的信息。 ----------------------- P0 | 0 | 1 | 2 | 3 | ----------------------- 4 | P1 | 5 | 6 | 7 | ----------------------- 8 | 9 | P2 | 10 | 11 | ----------------------- 12 |13 | 14 | P3 | 15 | ----------------------- 12 |13 | 14 | 15 |P4 | ----------------------- |
RAID 6: P+Q冗餘 |
P+Q冗餘方案。與RAID5相似,引入了額外的冗餘信息。 |
10.3.4 RAID級別的選擇
選擇RAID級別應該考慮以下的因素:
- 所需的額外磁盤存儲帶來的花費
- 在I/O操作數量方面的性能需求
- 磁盤故障時的性能
- 在數據重建過程(rebuild performance 即,故障磁盤上的數據在新磁盤上重建的過程)中的性能
重建故障磁盤上數據的時間:RAID1最簡單,直接從另一張磁盤中拷貝即可得到;其他級別的重建需要訪問磁盤陣列中所有其他的磁盤來進行重建,比較複雜,耗時較長。
RAID0 - 可以用於數據安全不是很重要的高性能應用。
RAID2和RAID4被RAID3級和RAID5級所包含,所以一般RAID的選擇只在RAID0,RAID1,RAID3和RAID5,RAID6上進行。
而RAID3的比特級拆分不如RAID5的塊級拆分,RAID5在大數據上與RAID3同樣好的數據傳輸率,同時對小數據的傳輸使用更少的磁盤,其並行性會減少延遲。實際中RAID3的性能會比RAID5的更差。
==>那麼問題就變成如何在RAID1,RAID5和RAID6上進行。
RAID6級比RAID5具有更高的可靠性,可以用於數據安全十分重要的應用。
RAID1:提供較好的寫操作的性能,在例如數據庫系統日誌文件的存儲這類的應用中使用廣泛
RAID5:相比RAID1需要較低的存儲負載,但是寫操作具有更高的開銷。對於經常用讀操作而很少進行寫操作的應用,RAID5是首選。
此外,設計者還要考慮到磁盤陳列包含的磁盤的數量,每個奇偶校驗位應該保護多少位數據?
- 磁盤陣列中的磁盤越多,數據傳輸率越高,但是系統會更昂貴
- 奇偶校驗位保護的數據位越多,存儲奇偶校驗位的空間越小,但是會導致數據丟失的概率增加。
10.3.5 硬件問題
RAID的實現還需要靠考慮硬件層的因素。
RAID可以不改變硬件層,只在軟件層上實現=>軟件RAID(software RAID);具有硬件支持的系統稱爲硬件RAID(hardware RAID)系統。
硬件RAID能夠實現使用非易失性RAM在需要執行的寫操作執行之前記錄它們。發生故障,系統恢復時,可以從非易失性RAM中讀取未完成寫操作的信息,並完成它們。
如果沒有這種硬件支持,據需要通過其他方式,檢查在故障前只有部分寫入的塊。
潛在故障(latent failure)或位腐(bit rot):雖然寫入成功,也可能存在其他的數據損壞,如:製作缺陷或者在相鄰軌道重複寫入導致的數據損壞。
擦洗(scrubbing): 爲了儘量減少數據丟失,好的RAID控制器會進行擦洗。即:在磁盤空閒期間,對每張磁盤的扇區進行讀取,如果發現無法讀取,則數據從RAID組織的其它磁盤進行恢復,並重新寫入。如果物理扇區被破壞,磁盤控制器可以以將邏輯扇區地址重映射到磁盤上其他的物理扇區的地址。
熱交換(Hot swapping):在不切斷電源的情況下將出錯的磁盤用新的磁盤進行替換。由於磁盤的替換不需要等待系統關閉這段時間,因此減少了平均恢復時間。可以通過爲每張磁盤提供一張空閒磁盤,當故障發生時,可以利用空前磁盤直接替換,這樣減少了數據丟失的機會,也減少了平均恢復時間。
RAID系統也需要考慮到電源、磁盤控制器或者系統互聯接口 都可能發生故障。==> 備用電源
10.3.6 其他的RAID的應用
RAID的概念可以推廣到其他存儲設備,如:磁帶陣列,無線系統上的數據廣播(數據拆分+奇偶校驗)
10.4 第三級存儲
常用的第三級存儲:磁帶,光盤
10.4.1 光盤
光盤CD的存儲了約爲640-700M。價格便宜。
數字視頻光盤DVD可以替代光盤,存儲更大的數據。例如,藍光DVD格式可以存儲27-54G的數據。
CD和DVD驅動器的激光頭組件更重,所以它們的尋道時間比磁盤驅動器更長,其數據傳輸率也低於磁盤。
可記錄一次的光盤(CD-R,DVD-R,DVD+R):容量大,壽命比磁盤更長,可以再遠程存儲和移除,==>適用於數據的歸檔存儲。因爲不能被重寫,所以可用於存儲不更改的信息,如:審計追蹤信息。
可多次重寫的版本(CD-RW,DVD-RW,DVD+RW,DVD-RAM):也可以用於數據歸檔。
自動光盤機(jukebox):是存儲大量的光盤的設備,可以按照需求自動將光盤裝載到少量驅動器中的一個上。這樣的系統的存儲總量是若干個TB。機械手可以對光盤進行裝載和卸載,時間是幾秒級,這比光盤的訪問時間要長很多。
10.4.2 磁帶
磁帶的速度低於磁盤和光盤,並且它只能順序存取,不支持隨機訪問。
磁帶主要用於備份,存儲不經常使用的數據,以及作爲將數據從一個系統轉到另一個系統的脫機介質。
磁帶相當可靠,但是磁帶能可靠讀寫的次數有限。
磁帶的容量取決於磁帶的長度、寬度和讀寫頭所能讀寫的密度。不同類型的磁帶可存儲的容量也不同,從幾個G,到幾百個G不等。
自動磁帶機:類似於自動光盤機,可以存放大量的磁帶,並有少量用於安裝磁帶的驅動器。存儲的數據最大範圍可達到若干PB,存取時間在幾秒到幾分鐘。
磁帶驅動器和磁帶庫的成本高,所以對於大量應用而言,備份數據到磁盤驅動器更划算。
10.5 文件組織
一個數據庫被映射爲多個不同的文件(file)。文件由底層的OS來維護,永久的存儲在磁盤上。
一個文件在邏輯上組織成爲記錄的一個序列。每個文件分成定長的存儲單元,稱爲塊(block)。
塊是存儲分配和數據傳輸的基本單元,多數數據庫默認使用4-8KB大小的塊。當創建數據庫時,可以指定塊大小。
一個塊可以包含多條記錄。要求每條記錄存儲在單個塊中,即:沒有一條記錄是部分包含在一個塊中的,以加速數據訪問。
關係數據庫中,不同關係的元組通常具有不同的大小,記錄可分爲定長記錄和變長記錄。
10.5.1 定長記錄
type instructor = record
ID varchar(5);
name varchar(20);
dept_name varchar(20);
salary numberic(8,2);
end
假設每個字符佔用1個字節,假設使用53個字節存儲instructor記錄。這種方式存在的問題:
- 如果塊的大小不是53,那麼可能會存在記錄跨邊界存儲。於是,讀這樣的一條記錄需要兩次塊訪問。
- 解決方案:對一個塊中只分配它能夠完整容納下的最大記錄數。
- 從這個結構中刪除一條記錄很困難。刪除的記錄所佔用的空間必須由文件的其它記錄填充;或者標記該空間爲忽略。
- 方法一:刪除一條記錄後,依次將後面的記錄往前挪。
- 缺點:需要額外的塊訪問操作。
- 方法二:將被刪除的記錄的存儲空間用來存儲新插入的記錄。這就需要標記該空間。引入如下結構:
- 在文件的開始處,分配一定數量的字節作爲文件頭(file header)。
- 令文件頭中除了文件的相關信息外,還包括被刪除的第一條記錄的地址。
- 在第一條被刪除的記錄處,來存儲第二條被刪除的記錄的地址。以此類推。
- ==>形成了有一個空閒列表(free list)
- 方法一:刪除一條記錄後,依次將後面的記錄往前挪。
10.5.2 變長記錄
變長記錄以下面幾種方式出現在數據庫中:
- 多種記錄類型在一個文件中存儲
- 允許一個或多個字段是變長的記錄類型
- 允許可重複字段的記錄類型,例如數組或多重集合
實現變長記錄需要解決的兩個關鍵問題:
- 如何描述一條記錄,使得單個屬性可以輕鬆的抽取
- 在塊中如何存儲變長記錄,使得塊中的記錄可以輕鬆的抽取
一條有變長屬性的記錄:定長屬性+變長屬性。其組成格式:
- 首先,記錄初始部分:記錄變長屬性對應的值對(偏移量,長度)。其中偏移量爲變長屬性的開始位置,長度表示變長屬性的字節長度。
- 接着,記錄定長屬性
- 最後,記錄變長屬性
10.6 文件中記錄的組織
10.5研究瞭如何在文件結構中表示記錄。
關係是記錄的集合,接下來就是看如何在文件中組織記錄。
- 堆文件組織(heap file organization): 將每個關係存儲到一個單獨的文件。文件中的記錄是無順序的。
- 順序文件組織(sequential file organization): 記錄根據“搜索碼”的值順序存儲。
- 散列文件組織(hashing file organization): 在記錄的某些屬性上計算一個散列函數,散列函數的結果確定了記錄應放到文件的哪個塊中。
通常每個記錄存儲在一個文件中,但是多表聚簇文件組織(multitable clustering file organization)中,幾個不同的關係的記錄存儲在同一個文件中。
10.6.1 順序文件組織
順序文件(sequential file)是爲了高效處理按某個搜索碼的順序排序的記錄而設計的。順序文件組織形式使用指針按順序連接記錄。
搜索碼(search key)可以使任意一個屬性或屬性的組合。
執行插入的過程:
- 找到待插入記錄之前的一條記錄。
- 如果這條記錄後有空閒記錄,則插入新的記錄,在調整指針
- 如果這條記錄之後沒有空閒記錄,則插入到溢出塊,再調整指針
插入過程的缺點:
- 如果存儲在溢出塊過多,會導致搜索碼的順序和物理順序之間的一致性喪失,此時順序處理的效率會變得低下。
- 解決:文件重組(reorganized),使其在物理上順序存儲。
- 重組待機愛很高,應該在負載低時執行
- 重組的頻率取決於新紀錄插入的頻率
- 解決:文件重組(reorganized),使其在物理上順序存儲。
10.6.2 多表聚簇文件組織
雖然通常一個關係存儲在一個文件中,這樣可以簡化數據管理。
但是,將多個關係存儲在一個文件中,或者在一個塊中存儲多個關係的記錄也很有用。
多表聚簇文件組織(multitable clustering file organization)中,是一種在每個塊中存儲兩個或者更多個關係的相關記錄的文件結構。
- 例如:自然連接 select dept_name, building, budget, ID, name, salary from department natural join instructor
- 可以將instructor中具有相同dept_name的記錄 存儲在department中具有相同dept_name記錄的附近,這樣可以加快自然連接時查詢塊的數量。
- 缺點:對於某些查詢,處理速度很慢。如:select * from department
- 解決方案:可以用指針把同一個關係的元組連接起來
10.7 數據字典存儲
元數據(meta data):數據的數據。
數據字典(data dictionary)/ 系統目錄(system catalog):存儲元數據的結構
系統必須存儲到數據字典中的內容可以包括以下:
關係的名字 關係中的屬性名字 屬性的域和長度 視圖的名字和視圖的定義 完整性約束 |
授權用戶的名字 關於用戶的授權和賬戶信息 用於認證用戶的密碼和其他信息 |
記錄關係的描述數據或統計數據: 每個關係中元組的數目 每個關係所使用的存儲方法(聚簇或非聚簇) |
記錄關係的存儲組織(順序、散列、或堆): 如果關係存儲在操作系統文件中,數據字典會記錄包含每個關係的文件名。 如果數據庫把所有關係存儲在一個文件中,數據字典可能會將每個關係中記錄的塊記在如鏈表這樣的數據結構中。 |
記錄每個關係的索引信息: 索引的名字 被索引的關係的名字 在其上定義索引的屬性 構造的索引的類型 |
通常使用數據庫中存儲關於數據庫本身的元數據:
10.8 數據庫緩存區
數據庫系統的主要目標之一是:減少磁盤和存儲器之間傳輸的塊數目。主存儲器中保留所有的塊時不可能的。
緩衝區(buffer) 是主存儲器中用於存儲磁盤塊拷貝的那部分。每個塊總有一個拷貝放在磁盤上,但是它可能比緩衝區中的拷貝舊。
緩衝區管理器(buffer manager)是負責緩衝區分配的子系統。
10.8.1 緩衝區管理器
應用程序請求塊的流程:
- 應用程序向緩衝區管理器發送塊請求
- 如果該塊在緩衝區存在,則緩衝區管理器將這個塊在主存中的地址發給請求者
- 如果該塊在緩衝區不存在,則:
- 緩衝區管理器首先爲該塊分配空間,如果需要會把其他的塊移出主存儲器 (移出的塊當且僅當放生改變時才被寫回磁盤)
- 然後把讀請求的塊從磁盤讀入緩衝區
- 將這個塊在主存中的地址發給請求者。
緩衝區管理器必須實現的技術:
- 緩衝區替換策略(buffer replacement strategy):當緩衝區沒有剩餘空間時,在新塊讀入緩衝區之前,把舊塊移出的策略。如:最近最少使用策略(Least Recently Used, LRU),即最近訪問最少的塊被寫回磁盤,並從緩衝區中移走。
- 被釘住的塊(pinned block):爲了使數據庫系統能夠從系統崩潰中恢復,限制一個塊寫回磁盤的時間是十分必要的。這種不允許寫回磁盤的塊稱爲被釘住的塊。例如:當塊正在更新時,則不允許將該塊寫回磁盤。該特性對可從崩潰中恢復的數據庫系統十分重要
- 塊的強制寫出(forced output of block): 在某些情況下,儘管不需要將一個塊所佔用的緩衝區空間,但是也必須把這個塊強制寫回磁盤,這樣的寫操作稱爲塊的強制寫出(forced output)。 ===> 原因:主存儲器的內容,包括緩衝區的內容,在崩潰時會丟失;而磁盤上的數據一般在崩潰時可以保留。
10.8.2 緩衝區替代策略
緩衝區替代方法有:
- 最近最少使用(Least Recently Used,LRU)塊替換策略:替換最近訪問最少的塊。最常用的方法。
- 立即丟棄(toss-immediate)策略:一個塊中最後一個原則處理完畢,就命令緩衝區釋放這個塊所佔用的空間。
- 最近最常使用策略(Most Recently Used,MRU):替換最近最常使用的塊。
緩衝區管理器也可以使用對某個特定關係的訪問請求做的統計信息。例如:
- 數據字典是數據庫中最經常訪問的部分,儘量不將它從主存中遷出。
- 索引的更新和訪問會很頻繁,所以一般不應該把索引塊從主存中刪除。
緩衝區管理在使用塊替換策略時,還要考慮到其他因素的影響。如:併發處理多個用戶請求,例如:保留被延遲的請求所需要的塊。
崩潰-恢復子系統對塊提供了更加嚴格的約束。
- 如果一個塊修改了,不允許緩衝區管理器將這個塊在緩衝區中的新內容協會磁盤,因爲這會破壞舊的數據。塊管理器子寫回塊之前,必須獲得崩潰-子系統的許可。
總結
- 大多數計算機系統存在多種數據存儲類型。可以根據訪問數據的速度、購買介質時每單位數據的成本和介質的可靠性,對這些存儲介質進行分類。可用的介質包括:告訴緩衝存儲器、主存儲器、快閃存儲器、磁盤、光盤和磁帶。
- 存儲介質的可靠性由兩個因素決定:電源故障或系統崩潰是否導致數據丟失,存儲設備發生物理故障的可能性有多大
- 通過保留數據的多個拷貝,可以減少物理故障的可能性。對磁盤來說,可以使用鏡像技術。或者可以使用更復雜的RAID(獨立磁盤冗餘陣列)的方法。通過把數據拆分到多張磁盤上,可以提高大數據訪問的吞吐率;通過引入多張磁盤上的冗餘存儲,可以顯著提高可靠性。有多種不同的RAID的組織形式,它們有不同的成本、性能和可靠性。最常用的是RAID1級(鏡像)和RAID5級。
- 可以把一個文件邏輯上組織映射到磁盤塊的一個記錄序列。把數據庫映射到文件的一種方法是使用多個文件,每個文件只存儲固定長度的記錄。另一種方法是構造文件,使之能夠存儲可變長度的記錄。分槽的頁方法廣泛用於在磁盤塊中處理變長記錄。
- 因爲數據以塊爲單位在磁盤存儲器和主存儲器之間傳輸,所以採取用一個單獨的塊包含相關聯的記錄的方式,將文件記錄分配到不同的塊中是可取的。如果我們能夠僅使用一次塊訪問就可以存取我們想要的多個記錄,就能節省磁盤訪問次數。因爲磁盤訪問通常是數據庫系統性能的瓶頸,所以設計塊中記錄的分配可以獲得顯著的性能提高。
- 數據字典,也稱爲系統目錄。用於記錄元數據,即關於數據的數據。
- 減少磁盤訪問數量的一種方法是在主存儲器中保留儘可能多的塊。因爲在主存儲中保留儘可能多的塊。因爲在主存儲器中保留所有的塊是不可能的,所以需要爲塊的存儲而管理主存儲器中可用空間的分配。緩衝區是主存儲器中的一部分,可以用於存儲磁盤塊的拷貝。負責分配緩衝區空間的子系統稱爲緩衝區管理器。