數據庫系統概念筆記——第10章 存儲和文件結構

第10章 存儲和文件結構

物理存儲介質概述

大多數計算機系統中存在多種數據存儲類型。可以根據訪問數據的速度,購買介質時每單位數據的成本,以及介質的可靠性對這些存儲介質進行分類。以下是幾種有代表性的介質:

  • 高速緩衝存儲器(cache)。高速緩衝存儲器是最快最昂貴的存儲介質。高速緩衝存儲器一般很小,由計算機系統硬件來管理它的使用。在數據庫系統中,我們不需要考慮高速緩衝存儲器的存儲管理。但值得注意的是,在設計查詢處理的數據結構和算法時,數據庫實現者也會注意高速緩衝存儲器的影響。

  • 主存儲器(main memory)。主存儲器是用於存放可處理的數據的存儲介質。通用機器指令在主存儲器上執行。儘管在個人電腦上的主存儲器可以包含幾個GB的數據,甚至在大型服務器系統中包含數百個GB的數據,但是一般情況下它對於存儲整個數據庫來說還是太小(或太昂貴)。如果發生電源故障或者系統崩潰,主存儲器中的內容通常會丟失。

  • 快閃存儲器(flash memory) 是在電源關閉(或故障)時數據可保存下來。目前有兩種類型的快閃存儲器,稱作NAND和NOR快閃。對於既定價格,NAND快閃擁有更高的存儲容量,並且廣泛作爲一些設備的數據存儲使用,例如照相機、音樂播放器和手機,同時也越來越多地用於筆記本電腦。相比於主存儲器,快閃存儲器擁有每字節更低的價格,以及具有非易失性,即便電源切斷,它也能保留存儲的數據。

  • 磁盤存儲器(magnetic-disk storage)。用於長期聯機數據存儲的主要介質是磁盤。通常整個數據庫都存儲在磁盤上。爲了能夠訪問數據,系統必須將數據從磁盤移到主存儲器。在完成指定的操作後,修改過的數據必須寫回磁盤。

  • 光學存儲器(optical storage):光學存儲器最流行的形式是光盤(Compact Disk,CD),它可以容納大約700MB的數據,播放約80分鐘。數字視頻光盤(Digital Video Disk,DVD)的每一盤面可以容納4.7GB或者8.5GB的數據(一張雙面盤最多可以容納17GB的數據)。可以用數字萬能光盤(digital versatile disk)代替數字視頻光盤(digital video disk)作爲DVD的全稱,因爲DVD可以存儲任何數字數據,而不僅僅是視頻數據。數據通過光學的方法存儲到光盤上,並通過激光器讀取。一種稱作藍光(Blu-ray)DVD的更高容量格式可以單層存儲27GB或雙層存儲54GB數據。

  • 磁帶存儲器(tape storage)。磁帶存儲器主要用於備份數據和歸檔數據。儘管磁帶比磁盤便宜得多,但是訪問數據也比磁盤慢得多,這是因爲磁帶必須從頭順序訪問。因爲這個原因,磁帶存儲器稱爲順序訪問(sequential-access)的存儲器。相對而言,磁盤存儲器稱爲直接訪問(direct-access)的存儲器,因爲它可以從磁盤的任何位置讀取數據。

磁帶具有很大的容量(現在的磁帶可以容納40~300GB的數據),並且可以從磁帶設備中移出,因此它們非常適合進行便宜的歸檔存儲。磁帶庫(自動磁帶機)用於存儲異常巨大的數據集合,比如可能有幾百TB(1TB=101210^{12}字節)的衛星數據,或少數情況下甚至是若干PB的數據(1PB=101510^{15}字節)。

在這裏插入圖片描述
最快的存儲介質(例如高速緩衝存儲器和主存儲器)稱爲基本存儲(primary storage)。層次結構中基本存儲介質的下一層介質(例如磁盤)稱爲輔助存儲(secondary storage)聯機存儲(online storage)。層次結構中最底層的介質(如磁帶機和自動光盤機)稱爲三級存儲(tertiary storage)或脫機存儲(offline storage)

磁盤和快閃存儲器

磁盤的物理特性

磁盤在物理上是相對簡單的。磁盤的每一個盤片(platter)是扁平的圓盤。它的兩個表面都覆蓋着磁性物質,信息就記錄在表面上。盤片由硬金屬或玻璃製成。
在這裏插入圖片描述

當磁盤被使用時,驅動馬達使磁盤以很高的恆定速度旋轉(通常爲每秒60、90或120轉,也可達到每秒250轉)。有一個讀寫頭恰好位於盤片表面的上方。盤片的表面從邏輯上劃分爲磁道(track),磁道又劃分爲扇區(sector)。扇區是從磁盤讀出和寫入信息的最小單位。對於現在的磁盤,扇區大小一般爲512字節,每一個盤片有約50000 \sim 100000條磁道,每條磁盤有151\sim 5個盤片。內側的磁道(離轉軸近的地方)長度較短,在現代的磁盤中,外側的磁道比內側的磁道擁有更多的扇區。一般而言,內側每磁道大約包含5001000500\sim 1000個扇區,而外側每磁道大約包含100020001000\sim 2000個扇區。對於不同模式的磁盤,上面的數字會有變化,高容量的模式通常在每條磁道上含有更多的扇區,而且在每個盤片上有更多的磁道。

通過反轉磁性物質磁化的方向,讀寫頭(read-write head)將信息磁化存儲到扇區中。

磁盤的每個盤片的每一面都有一個讀寫頭,讀寫頭通過在盤片上移動來訪問不同的磁道。一張磁盤通常包括很多個盤片,所有磁道的讀寫頭安裝在一個稱爲磁盤臂(diskarm)的單獨裝置上,並且一起移動。安裝在轉軸上的所有磁盤盤片和安裝在磁盤臂上的所有讀寫頭統稱爲磁頭-磁盤裝置(head-disk assembly)。因爲所有盤片上的讀寫頭一起移動,所以當某一個盤片的讀寫頭在第ii條磁道上時,所有其他盤片的讀寫頭也都在各自盤片的第ii條磁道上。因此,所有盤片的第ii條磁道合在一起稱爲第ii柱面(cylinder)

爲了增大記錄密度,讀寫頭儘可能地靠近磁盤盤片的表面。讀寫頭一般浮於盤片表面之上幾微米;磁盤的旋轉產生微風,而磁頭裝置的形狀使其在微風作用下恰好浮於盤片表面之上。因爲讀寫頭離盤片表面非常近,所以盤片必須製作得非常平。

讀寫頭損壞是一個問題。如果讀寫頭接觸到盤片的表面,讀寫頭會刮掉磁盤上的記錄介質,破壞存放在那裏的數據。在早期的磁盤上,讀寫頭接觸盤片表面所刮掉的介質將散落到其他盤片及其讀寫頭之間,引起更多的損壞,因此一個讀寫頭的損壞可能導致整張磁盤失效。目前使用的磁盤驅動器使用一層磁金屬薄膜作爲存儲記錄的介質。這樣的磁盤和以前的塗氧化膜的磁盤相比,不易因爲讀寫頭損壞而產生故障。

磁盤控制器(disk controller)作爲計算機系統和實際的磁盤驅動器硬件之間的接口。在現代磁盤系統中,磁盤控制器在磁盤驅動單元內部實現。它接受高層次的讀寫扇區的命令,然後開始動作,如移動磁盤臂到正確的磁道,並實際地讀寫數據。磁盤控制器爲它所寫的每個扇區附加校驗和(checksum),校驗和是從寫到扇區中的數據計算得到的。當讀取一個扇區時,磁盤控制器用讀到的數據再一次計算校驗和,並且把它與存儲的校驗和比較。如果數據被破壞,則新計算出的校驗和與存儲的校驗和不一致的可能性就很高。如果發生了這樣的錯誤,磁盤控制器就會重讀幾次;如果錯誤繼續發生,磁盤控制器就會發出一個讀操作失敗的信號。

磁盤控制器執行的另一個有趣的任務是壞扇區的置映射(remapping of bad sector)。當磁盤初始格式化時,或試圖寫一個扇區時,如果磁盤控制器檢測到一個損壞的扇區,它會把這個扇區在邏輯上映射到另一個物理位置(從爲此目的而留出的額外扇區中分配)。重映射記錄在磁盤或非易失性存儲器中,而寫操作在新的位置上執行。

磁盤通過一個高速互連通道連接到計算機系統。有大量的通用接口用於將磁盤連接到計算機,現今一般使用的接口是:

  1. SATA,也叫串行ATA(serialATA9),最新版本的SATA稱作 SATAⅡ
    或者SATA3Gb(ATA標準的舊版本稱作PATA,或並行ATA,或者IDE,在早期廣泛地使用,並且現在依舊可用)
  2. 小型計算機系統互聯(Small-Computer-System Interconnect,SCSI,發音爲
    “scuzzy”
  3. SAS,也叫串行附着SCSI(serial attached SCSI),和(4)光纖通道接口(Fibre Channel Interface)。
  4. 便攜式外部磁盤系統經常使用USB接口或IEEE1394火線接口。

磁盤通常可以通過電纜直接與計算機系統的磁盤接口相連,也可以放置到遠端並通過高速網絡與磁盤控制器相連。在存儲區域網(Storage Area Network,SAN)體系結構中,大量的磁盤通過高速網絡與許多計算機服務器相連。通常磁盤採用獨立磁盤冗餘陣列(Redundant Array of Independent Disk,RAID)技術進行本地化組織,從而給服務器一個很大且非常可靠的磁盤的邏輯視圖。儘管可能被網絡分開,計算機和磁盤子系統繼續通過SCSI、SAS和光纖通道接口互相通信。

網絡附加存儲(Network Attached Storage,NAS)由SAN發展而來。NAS很像SAN,但是它通過使用網絡文件系統協議(如NFS或CIFS)提供文件系統接口,而不是看似一張大磁盤的網絡存儲器。

磁盤性能的度量

磁盤質量的主要度量指標是容量、訪問時間、數據傳輸率和可靠性。

訪問時間(access time)是從發出讀寫請求到數據開始傳輸之間的時間。磁盤上指定扇區的數據,磁盤臂首先必須移動,以定位到正確的磁道,然後等待磁盤旋轉,直到指定的扇區出現在它下方。磁盤臂重定位的時間稱爲尋道時間(seek time),它隨磁盤臂移動距離的增大而增大。典型的尋道時間在2302\sim 30毫秒之間,依賴於目的磁道距離磁盤臂的初始位置有多遠。較小的磁盤因爲移動距離較短而尋道時間較短。

平均尋道時間(average seek time) 是尋道時間的平均值,是在一個(均勻分佈的)隨機請求的序列上計算得到的。假設所有的磁道包含相同的扇區數,同時我們忽略讀寫頭開始移動和結束移動所花費的時間,我們可以得到平均尋道時間是最壞情況下尋道時間的1/3。考慮到前面忽略的這些因素,平均尋道時間大約是最長尋道時間的1/2。現在,平均尋道時間在4104\sim 10毫秒之間,依賴於磁盤模式。

一旦讀寫頭到達了所需的磁道,等待訪問的扇區出現在讀寫頭下所花費的時間稱爲旋轉等待時間(rotational latency time)。現在一般的磁盤轉速在每分鐘5400轉(每秒90轉)到每分鐘15000轉(每秒250轉)之間,或者等價地,在每轉4毫秒到每轉11毫秒之間。平均情況下,磁盤需要旋轉半周才能使所要訪問的扇區開始處於讀寫頭的下方。因此磁盤的平均旋轉等待時間是磁盤旋轉一週時間的1/2。

數據傳輸率(data-transfer rate) 是從磁盤獲得數據或者向磁盤存儲數據的速率。目前的磁盤系統支持每秒25100 MB25\sim 100 \ MB的數據最大傳輸率。對於磁盤的內側磁道,數據傳輸率明顯低於最大傳輸率。

最後一個經常使用的磁盤度量標準是平均故障時間(Mean Time To Failure,MTTF),這是磁盤可靠性的度量標準。磁盤(或其他任何系統)的平均故障時間是,平均說來我們可以期望系統無故障連續運行的時間量。據生產商聲稱,現代磁盤的平均故障時間在5000001200000500000\sim 1200000小時之間(大約5713657\sim 136年)。事實上,這裏聲稱的平均故障時間是基於全新磁盤發生故障的可能性計算的。

磁盤塊訪問的優化

磁盤I/O請求是由文件系統和大多數操作系統具有的虛擬內存管理器產生的。每個請求指定了要訪問的磁盤地址,這個地址是以塊號的形式提供的。一個塊(block) 是一個邏輯單元,它包含固定數目的連續扇區。塊大小在512字節到幾KB之間。數據在磁盤和主存儲器之間以塊爲單位傳輸。術語頁(page)常用來指塊,儘管在有些語境(例如閃存)中指的是另外的含義。

來自磁盤的連續請求有可以歸類成順序訪問模式或隨機訪問模式。在一個順序訪問(sequentialaccess) 模式中,連續的請求會請求處於相同的磁道或是相鄰的磁道上連續的塊。在順序訪問中讀取塊時,第一塊可能需要一次磁盤尋道,但是相繼的請求既不需要尋道,也不需要對相鄰磁道的尋道,這比對一條更遠處的磁道尋道要快。

與之相反,在隨機訪問(random access)模式中,相繼的請求會請求那些隨機位於磁盤上的塊。每一個請求都需要一次磁盤尋道。一張磁盤在一秒鐘內能滿足的隨機塊訪問的數量取決於尋道時間,並且通常是每秒100200100\sim 200的訪問次數。由於每次尋道只有少量的數據(一塊數據)被讀取,因此隨機訪問模式的數據傳輸率明顯低於順序訪問模式。

爲了提高訪問塊的速度,產生了許多技術。

  • 緩衝(buffering):從磁盤讀取的塊暫時存儲在內存緩衝區中,以滿足將來的要求。緩衝通過操作系統和數據庫系統共同運作。
  • 預讀(read-ahead):當-一個磁盤塊被訪問時,相同磁道的連續塊也被讀入內存緩衝區中,即便沒有針對這些塊的即將來臨的請求。在順序訪問的情況下,當它們被請求時,這種預讀可以確保許多塊已經在內存中,減少了磁盤尋道和讀取每塊的旋轉等待時間。操作系統也經常對操作系統文件預先讀取連續的塊。但是,預讀對於隨機塊訪問並不是很有用。
  • 調度(scheduling):如果需要把一個柱面上的幾個塊從磁盤傳輸到主存儲器,我們可以按塊經過讀寫頭的順序發出訪問塊的請求,從而節省訪問時間。如果所需的塊在不同的柱面上,按照使磁盤臂移動最短距離的順序發出訪問塊的請求是非常有利的
    • 磁盤臂調度(disk-arm scheduling)算法試圖把對磁道的訪問按照能增加可以處理的訪問數量的方式排序。通常使用的算法是電梯算法(elevator algorithm),這種算法的工作方式與許多電梯的工作方式非常相似。假設一開始,磁盤臂從最內端的磁道向磁盤的最外端移動。在電梯算法的控制下,對每條有訪問請求的磁道,磁盤臂都在那條磁道停下,爲這條磁道的請求提供服務,然後繼續向外移動,直到沒有對更外層磁道的等待請求。這時,磁盤臂掉轉方向,開始向內側移動,同樣在每條有請求的磁道處停下,直到沒有更靠近中心的磁道上有請求在等待。接着,它掉轉方向,開始一個新的週期。磁盤控制器通常對讀請求進行重新排序以提高性能,因爲它最清楚磁盤塊的組織、磁盤盤片的旋轉位置和磁盤臂的位置。
  • 文件組織(file organization):爲了減少塊訪問時間,我們可以按照與預期的數據訪問方式最接近的方式來組織磁盤上的塊。例如,如果我們預計一個文件將順序地訪問,那麼理想情況下我們應該使文件的所有塊存儲在連續的相鄰柱面上。隨後的操作系統,如UNIX和Windows操作系統,對用戶隱藏了磁盤的組織,並且由操作系統內部來管理空間的分配。儘管它們不能保證一個文件的所有塊順序分佈,但它們一次爲一個文件分配多個連續的塊(一個區(extent))。然後,文件的順序訪問只需每個區尋道一次,而不是每個塊尋道一次。經過一段時間,一個連續的文件將變得碎片化(fragmented),即它的塊散佈在整張磁盤上。爲了減少碎片,系統可以對磁盤上的數據進行一次備份,然後再恢復整張磁盤。恢復操作將每個文件的塊連續地(或幾乎連續地)寫回。一些系統(如Windows操作系統的不同版本)提供掃描整張磁盤然後移動塊以減少碎片的工具。這種技術所實現的性能提高非常顯著。
  • 非易失性寫緩衝區(nonvolatile write buffer)。因爲主存儲器中的內容在發生電源故障時將全部丟失,所以關於數據庫更新的信息必須記錄到磁盤上,這樣才能在系統崩潰時得以保存。因此,更新操作密集的數據庫應用的性能,如事務處理系統的性能,高度依賴於磁盤寫操作的速度。
  • 日誌磁盤(log disk)。減少寫等待時間的另一種方法是使用日誌磁盤,即一種專門用於寫順序日誌的磁盤,這和非易失性RAM緩衝區的使用非常相似。對日誌磁盤的所有訪問都是順序的,這從根本上消除了尋道時間,並且一次可以寫幾個連續的塊,使得寫日誌磁盤比隨機的寫要快許多倍。和前面一樣,數據也必須寫到它們在磁盤上的實際位置,但是數據庫系統不需要等待這種寫操作的完成,日誌磁盤會在以後完成寫操作。進一步說,日誌磁盤可以爲了最少化磁盤臂的移動而重排寫操作的順序。如果系統在實際磁盤寫操作完成以前崩潰,在系統恢復後,系統可以讀取日誌磁盤,找到那些還沒有完成的寫操作並將它們完成。

爲了處理這種數據結構破壞的可能性,早期文件系統必須在系統重新啓動時執行一個文件系統一致性檢驗,以保證數據結構是一致的。且如果它們不一致,必須執行額外的步驟還原它們以保證一致性。這些檢驗會使得系統崩潰後的重啓動有較長的延時,而且這個延時隨着磁盤系統容量的增加而變得更加嚴重。日誌文件系統允許快速重啓動而不需要這樣的一致性檢驗。

快閃存儲

一共有兩種快閃存儲器,即NOR快閃和NAND快閃。NOR快閃允許隨機訪問閃存中的單個字,並且擁有和主存可媲美的讀取速度。而NAND快閃和NOR快閃不同,它的讀取需要將整個數據頁從NAND快閃取到主存儲器中,該數據頁通常包括5124096512\sim 4096字節。NAND快閃中的頁和磁盤中的扇區十分相似。但是NAND快閃明顯比NOR快閃便宜,並且擁有更高的存儲容量,且目前更廣泛使用。

採用NAND快閃構建的存儲系統提供與磁盤存儲器相同的面向塊的接口。與磁盤相比,閃存可以提供更快的隨機存取:一個數據頁,從閃存中可以在約121\sim 2微秒內檢索到,而從磁盤上的一個隨機訪問則需要5105\sim 10毫秒。閃存具有比磁盤低的傳輸速率,一般來說爲每秒20MB。最近的一些閃存的傳輸速率增加到每秒100200MB100\sim 200MB。然而,固態驅動器並行地使用多塊閃存芯片,將傳輸速率提高到每秒200MB以上,這比大多數磁盤的傳輸速率更快。

閃存的寫入稍有些複雜。寫一個閃存頁面通常需要幾微秒。然而,一旦寫入,閃存的頁面不能直接覆蓋。它必須先擦除然後再重寫。一次擦除操作可以在多個頁面執行,稱爲擦除塊(erase block),這種操作需時約121\sim 2毫秒。一個擦除塊的大小(在閃存文獻中通常描述爲“塊”)通常明顯比存儲系統的塊大很多。此外,對一個閃存頁可以擦除多少次存在限制,通常大約爲1010010萬\sim 100萬次。一旦達到此限制,在存儲位就可能發生錯誤。

閃存系統通過映射邏輯頁碼到物理頁碼,限制了慢擦除速度和更新限制的影響。當一個邏輯頁更新時,它可以重新映射到任何已擦除的物理頁,它原來的位置可以隨後擦除。每個物理頁都有一個小的存儲區域來保存它的邏輯地址;如果邏輯地址重新映射到一個不同的物理頁,則原來的物理頁被標記爲已刪除。因此,通過掃描物理頁,我們可以發現每個邏輯頁的位置。爲了快速訪問,邏輯到物理的頁面映射被複制到內存的轉換表(translation table) 中。

所有的上述動作通過一個叫做閃存轉換層(flash translation layer) 的軟件層完成。在這一層之上,閃存存儲器看起來和磁盤存儲器一樣,都提供同樣的面向頁/扇區的接口,除了閃存存儲器快得多。因此,文件系統和數據庫存儲結構可以看到相同的底層存儲結構邏輯視圖,無論是閃存存儲器或磁盤存儲器。

混合硬盤驅動器(hybird disk drive) 是結合了小容量閃存存儲器的硬盤系統,對頻繁訪問的數據,該驅動器作爲緩存使用。頻繁訪問但很少更新的數據最適合於緩存在閃存存儲器中。

RAID

爲了提高性能和可靠性,人們提出了統稱爲獨立磁盤冗餘陣列(Redundant Array of Independent Disk,RAID)的多種磁盤組織技術。

通過冗餘提高可靠性

引入冗餘(redundancy) 是解決這個可靠性問題的方法,即存儲正常情況下不需要的額外信息,但這些信息可在發生磁盤故障時用於重建丟失的信息。這樣,即使有一張磁盤發生了故障,數據也不會丟失,從而延長了磁盤發生故障的有效平均時間(這裏只計導致數據丟失或數據不可用的磁盤故障)。

實現冗餘最簡單(但最昂貴)的方法是複製每一張磁盤。這種技術稱爲鏡像(mirroring)(或者有時稱爲影子)。這樣,一張邏輯磁盤由兩張物理磁盤組成,並且每一次寫操作都要在兩張磁盤上執行。如果其中一張磁盤發生了故障,數據可以從另一張磁盤讀出。只有當第一張磁盤的故障被修復之前,第二張磁盤也發生了故障時,數據纔會丟失。

採用鏡像技術的磁盤的平均故障時間(這裏的故障是指數據的丟失)依賴於單張磁盤的平均故障時間和平均修復時間(mean time to repair)平均修復時間是替換髮生故障的磁盤並且恢復這張磁盤上的數據所花費的(平均)時間。假設兩張磁盤發生故障是相互獨立的,即一張磁盤的故障和另一張磁盤的故障之間沒有聯繫。

通過並行提高性能

我們可以通過在多張磁盤上進行數據拆分(striping data)來提高傳輸速率。數據拆分最簡單的形式是將每個字節按比特分開,存儲到多個磁盤上。這種拆分稱爲比特級拆分(bit-level striping)

塊級拆分(block-level striping) 是將塊拆分到多張磁盤。它把磁盤陣列看成一張單獨的大磁盤,並且給塊進行邏輯編號,這裏我們假設塊的邏輯編號從0開始。對於n張磁盤的陣列,塊級拆分將磁盤陣列邏輯上的第ii個塊存儲到第imod  n+1(i\mod n)+1張磁盤上:即用第in\lfloor\frac{i}{n} \rfloor個物理塊存儲邏輯塊ii

塊級拆分是最常用的數據拆分形式。其他層次的拆分,例如將扇區按字節拆分或者將塊按扇區拆分,也是可以實現的。
總之,磁盤系統中的並行有兩個主要的目的:

  1. 負載平衡多個小的訪問操作(塊訪問),以提高這種訪問操作的吞吐量。
  2. 並行執行大的訪問操作,以減少大訪問操作的響應時間。

RAID級別

鏡像提供了高可靠性,但它十分昂貴。拆分提供了高數據傳輸率,但不能提高可靠性。通過結合“奇偶校驗位”(在下文描述)和磁盤拆分思想,從而以較低的代價提供數據冗餘,人們已經提出了一些不同的替換方案。這些方案具有不同的成本和性能之間的權衡,並且分爲若干RAID級別(RAID level)。

RAID 0級(RAID level 0)

指塊級拆分但沒有任何冗餘(例如鏡像或奇偶校驗位)的磁盤陣列。

在這裏插入圖片描述

RAID 1級(RAID level 1)

指的是使用塊級拆分的磁盤鏡像。
在這裏插入圖片描述

注意一些廠商使用RAID1+0級或RAID10級來指代使用拆分的鏡像,使用RAID1級指代不使用拆分的鏡像。不使用拆分的鏡像可以與磁盤陣列一起使用,以呈現爲一張單一的大型可靠磁盤:如果每張磁盤有M塊,邏輯塊0M10\sim M-1存儲在磁盤0上,邏輯塊M2M1M\sim 2M-1存儲在磁盤1(第二張磁盤)上,依次類推,且每張磁盤都有鏡像。

RAID 2級(RAID level 2)

稱爲內存風格的糾錯碼(Ermor-Correcting-Code,ECC) 組織結構,使用奇偶校驗位。長期以來,內存系統使用奇偶校驗位來實現錯誤檢測和糾正。內存系統中的每個字節都有一個與之相聯繫的奇偶校驗位,它記錄了這個字節中爲1的位數是偶數(奇偶校驗位=0)還是奇數(奇偶校驗位=1)。如果這個字節中有一位被破壞(1變成0,或0變成1),那麼這個字節的奇偶校驗位就會改變,而與存儲的奇偶校驗位不匹配。同樣地,如果存儲的奇偶校驗位被破壞,它就不能和計算出的奇偶校驗位相匹配。因此,內存系統可以檢測到所有的1位錯誤。糾錯碼機制存儲兩個或更多的附加位,並且如果有一位被破壞,它可以重建數據。

在這裏插入圖片描述
通過把字節拆分存儲到多張磁盤上,糾錯碼的思想可以直接用於磁盤陣列。例如,每個字節的第一位存儲在磁盤0中,第二位存儲在磁盤1中,如此下去,直到第8位存儲在磁盤7中,糾錯位存儲在其餘的磁盤中。

RAID 3級(RAID level 3)

RAID3級在RAID2級的基礎上進行了改進。與內存系統不同,磁盤控制器能夠檢測一個扇區是否正確地讀出,所以可以使用一個單一的奇偶校驗位來檢錯和糾錯。它的思想如下:如果一個扇區被破壞,系統能準確地知道是哪個扇區壞了,並且對扇區中的每一位,系統可以通過計算其他磁盤上對應扇區的對應位的奇偶值來推斷出該位是1還是0。如果其餘位的奇偶校驗位等於存儲的奇偶校驗位,則丟失的位是0,反之爲1。

RAID3級和RAID2級一樣好,但是在額外磁盤的數目方面更加節省(它只有一張磁盤的開銷),所以在實際中並不使用RAID2。

在這裏插入圖片描述
RAID3級與RAID1級相比有兩個好處。

  • RAID3級對多張常規磁盤只需要一個奇偶校驗磁盤,而RAID1級對每張磁盤都需要一張鏡像磁盤,因此RAID3級減少了存儲的開銷;因爲使用N道數據拆分的RAID3級對一個字節的讀寫散佈在多張磁盤中,所以它使用N道數據拆分讀寫一個塊的傳輸率是RAID1級的N倍
  • 因爲每張磁盤都要參與每個I/O請求,所以RAID3級每秒鐘支持的I/O作數較少。

RAID 4級(RAID level 4)

RAID4級(RAID level4),塊交叉的奇偶校驗組織結構。它像RAID0級一樣使用塊級拆分,此外在一張獨立的磁盤上爲其他N張磁盤上對應的塊保留一個奇偶校驗塊。如果一張磁盤發生故障,可以使用奇偶校驗塊和其他磁盤上對應的塊來恢復發生故障的磁盤上的塊。

它讀取一個塊只訪問一張磁盤,因此允許其他的請求在其他磁盤上執行。這樣,每個訪問操作的數據傳輸率較低,但可以並行地執行多個讀操作,從而能產生較高的總I/O傳輸率。由於所有磁盤可以並行地讀,因此讀取大量數據的操作有很高的傳輸率。寫入大量數據的操作也有很高的傳輸率,因爲數據和奇偶校驗位可以並行地寫。

在這裏插入圖片描述

RAID 5 級(RAID level 5)

塊交叉的分佈奇偶校驗位的組織結構。RAID5級在RAID4級的基礎上進行了改進,將數據和奇偶校驗位都分佈到所有的N+1張磁盤中,而不是在N張磁盤上存儲數據並在一張磁盤上存儲奇偶校驗位。在RAID5級中,所有磁盤都能參與對讀請求的服務,而不像RAID4級中存儲奇偶校驗位的磁盤不參與讀操作,所以RAID5級增加了在一段給定的時間中能處理的請求總數。對每個由N個邏輯磁盤塊組成的集合來說,其中一張磁盤存儲奇偶校驗塊,而其餘的N張磁盤存儲邏輯磁盤塊。
在這裏插入圖片描述

RAID 6 級(RAID level 6)

P+Q冗餘方案。它和RAID5級非常相似,但是存儲了額外的冗餘信息,以應對多張磁盤發生故障的情況。RAID6不使用奇偶校驗的方法,而是使用像Reed Solomon 碼之類的糾錯碼。這種方法與RAID5級對每4位數據存儲1個奇偶校驗位不同,它爲每4位數據存儲2位的冗餘信息,這樣系統可容忍兩張磁盤發生故障。
在這裏插入圖片描述

RAID級別的選擇

選擇RAID級別應該考慮以下的因素:

  • 所需的額外磁盤存儲帶來的花費。
  • 在I/O操作數量方面的性能需求。
  • 磁盤故障時的性能。
  • 數據重建過程(即,故障磁盤上的數據在新磁盤上重建的過程)中的性能。

RAID0級用於數據安全性不是很重要的高性能應用。

因爲RAID2級和RAID4級被RAID3級和RAID5級所包含,所以RAID級別的選擇只限於在剩下的級別中進行。

比特級拆分(RAID3級)不如塊級拆分(RAID5級),這是因爲塊級拆分對於大量數據的傳輸有與RAID3級同樣好的數據傳輸率,同時對於小量數據的傳輸使用更少的磁盤。

對於小量數據傳輸,磁盤訪問時間佔主要地位,所以並行讀取並沒有帶來好處。事實上,對於小量數據傳輸,RAID3級可能比RAID5級的性能更差,這是由於只有當所有磁盤上的相關扇區都讀出後傳輸纔算完成,因此採用RAID3級的磁盤陣列的平均延遲變得非常接近於單張磁盤在最壞情況下的延遲,從而抵消了其較高傳輸速率的長處。

當前,許多RAID的實現並不支持RAID6級,但是RAID6級提供比RAID5級更高的可靠性,可以用於數據安全十分重要的應用。

在RAID1級和RAID5級中做出選擇十分困難。由於RAID1級提供最好的寫操作的性能,因此在例如數據庫系統日誌文件的存儲這樣的應用中使用廣泛。RAID5級與RAID1級相比具有較低的存儲負載,但寫操作需要更高的時間開銷。對於經常進行讀操作而很少進行寫操作的應用,RAID5級是首選。

硬件問題

選擇RAID實現要考慮的另一個因素在硬件層上。RAID可以在不改變硬件層,只修改軟件的基礎上實現,這樣的RAID稱爲軟件RAID(software RAID)。然而,建立支持RAID的專用硬件也會帶來下面所介紹的很大的好處。具有專用硬件支持的系統稱爲**硬件 RAID(hardware RAID)**系統。

硬件RAID實現能夠使用非易失性RAM在需要執行的寫操作執行之前記錄它們。如果發生電源故障,在系統恢復時,它可以從非易失性RAM中獲得有關未完成的寫操作的信息,並完成它們。如果沒有這種硬件支持,就需要做一些額外的工作,檢測在電源故障前只有部分寫人的塊。

爲了儘量減少數據丟失的可能,良好的RAID控制器會進行擦洗(scrubbing),也就是說,在磁盤空閒時期,對每張磁盤的每一個扇區進行讀取,如果發現某個扇區無法讀取,則數據從RAID組織的其餘磁盤中進行恢復,並寫回到扇區中。(如果物理扇區損壞,磁盤控制器將邏輯扇區地址重新映射到磁盤上其他的物理扇區地址。)

一些硬件RAID實現允許熱交換(hot swapping),就是在不切斷電源的情況下將出錯磁盤用新的磁盤替換。由於磁盤的替換不需要等待系統關閉這段時間,因此熱交換減少了平均恢復時間。事實上,現在的許多關鍵系統都以24×7的時間表運行,即:一天運行24小時,一週運行7天。因而沒有時間關閉系統和替換故障磁盤。進一步而言,許多RAID實現給每一個磁盤陣列(或一個磁盤陣列集)分配一張空閒磁盤。當系統中有磁盤發生了故障,空閒磁盤會立即代替故障磁盤工作。這樣可以顯著降低平均修復時間,減小數據丟失的機會。可以從容地替換掉故障磁盤。

第三級存儲

光盤

DVD-5格式的光盤可以存儲4.7GB的數據(在一個記錄層),而DVD-9格式的光盤可以存儲8.5GB的數據(在兩個記錄層)。在光盤的兩面都存儲就具有更大的容量;如,作爲DVD-5格式和DVD-9格式的雙面存儲版本,DVD-10格式和DVD-18格式分別可以存儲9.4GB和17GB的數據。藍光DVD格式具有275427\sim 54GB的更高的單碟存儲容量。

由於CD和DVD驅動器的激光頭組件更重,因此比一般的磁盤驅動器需要更長的尋道時間(通常是100毫秒)。雖然最快的CD和DVD驅動器轉速和低檔的磁盤驅動器轉速接近,大約是每分鐘3000轉,但是仍比一般的磁盤驅動器轉速慢。CD驅動器的旋轉速度原來是和音頻CD的標準一致,DVD驅動器的旋轉速度原來是和DVD視頻標準一致,但是,現在的驅動器旋轉速度比標準速度高很多倍。

CD和DVD的數據傳輸率比磁盤的數據傳輸率要慢一些。目前的CD驅動器的讀取速度大約是每秒363\sim 6MB,而DVD是每秒8208\sim20MB。與磁盤一樣,光盤在外側軌道存儲的數據比內側軌道要多。光盤的數據傳輸率用nxnx表示,意思是驅動器支持的傳輸速率是標準速率的n倍,現在常用的CD是50倍速,DVD是16倍速。

因爲可記錄一次的光盤(CD-R、DVD-R和DVD+R)容量大,比磁盤有更長的壽命,而且可以在遠程存儲和移除,所以適合於數據分發,尤其適合於數據的歸檔存儲。因爲它們不能重寫,所以它們可用於存儲不應更改的信息,比如審計追蹤信息。可多次重寫的版本(像CD-RW、DVD-RW、DVD+RW和DVD-RAM)也可用於數據歸檔。

磁帶

儘管相對而言磁帶的保存時間更長久些,並且能夠存儲大量的數據,但是它與磁盤和光盤相比速度較慢。更重要的是,磁帶只能進行順序存取。因此磁帶不能提供輔助存儲所需的隨機訪問,雖然在歷史上,磁帶是先於磁盤被作爲輔助存儲介質使用的。
磁帶主要用於備份,存儲不經常使用的數據,以及作爲將數據從一個系統轉到另一個系統的脫機介質。磁帶還應用於存儲大量數據,例如視頻和圖像數據,它們不需要迅速地訪問,或者因爲數據量太大以至於磁盤存儲太昂貴。

當前磁帶的容量也相差甚遠,有幾個GB的數字音頻磁帶(Digital Audio Tape,DAT)格式,1040GB10\sim 40GB的數字線性磁帶(Digital Linear Tape,DLT)格式,100GB或者更高的UItrium格式,以及330GB的Ampex螺旋掃描(Ampex helical scan)磁帶格式。數據傳輸率在每秒幾到幾十MB的數量級。

文件組織

一個數據庫被映射到多個不同的文件,這些文件由底層的操作系統來維護。這些文件永久地存在於磁盤上。一個文件(file)在邏輯上組織成爲記錄的一個序列。這些記錄映射到磁盤塊上。因爲文件由操作系統作爲一種基本結構提供,所以我們將假定作爲基礎的文件系統是存在的。我們需要考慮用文件表示邏輯數據模型的不同方式。
每個文件分成定長的存儲單元,稱爲塊(block)。塊是存儲分配和數據傳輸的基本單元。大多數數據庫默認使用484\sim 8KB的塊大小,但是當創建數據庫實例時,許多數據庫允許指定塊大小。更大的塊在一些數據庫應用中是很有用的。

在關係數據庫中,不同關係的元組通常具有不同的大小。把數據庫映射到文件的一種方法是使用多個文件,在任意一個文件中只存儲一個固定長度的記錄。另一種選擇是構造自己的文件,使之能夠容納多種長度的記錄。然而,定長記錄文件比變長記錄文件更容易實現。很多用於定長記錄文件的技術可以應用到變長的情況。因此,我們首先考慮定長記錄文件,並且隨後考慮變長記錄存儲。

定長記錄

type 
	instructor=record 
	ID varchar(5); 
	name varchar(20); 
	dept_name varchar(20); 
	salary numeric(8,2); 
end

假設每個字符佔1個字節,numeric(8,2)佔8個字節。假設我們爲每個屬性ID、name和dept_name分配可以容納的最大字節數,而不是分配可變的字節數。於是instuctor記錄佔53個字節。一個簡單的方法是使用前53個字節來存儲第一條記錄,接下來的53個字節存儲第二條記錄,以此類推,然而這種簡單的方法有兩個問題:

  • 除非塊的大小恰好是53的倍數(一般是不太可能的),否則一些記錄會跨過塊的邊界,即一條記錄的一部分存儲在一個塊中,而另一部分存儲在另一個塊中。於是,讀寫這樣一條記錄需要兩次塊訪問。
  • 從這個結構中刪除一條記錄十分困難。刪除的記錄所佔據的空間必須由文件中的其他記錄來填充,或者我們必須用一種方法標記刪除的記錄使得它可以被忽略。

爲了避免第一個問題,我們在一個塊中只分配它能完整容納下的最大的記錄數(這個數字可以很容易通過塊大小除以記錄大小計算出來,並廢棄小數部分)。每個塊中餘下的字節就不使用了。

當一條記錄被刪除時,我們可以把緊跟其後的記錄移動到被刪記錄先前佔據的空間,依次類推,直到被刪記錄後面的每一條記錄都向前做了移動。這種方法需要移動大量的記錄。簡單地將文件的最後一條記錄移到被刪記錄所佔據空間中可能更容易一些。但是移動記錄以佔據刪除記錄所釋放空間的做法是很不理想的。

在文件的開始處,我們分配一定數量的字節作爲文件頭(file header)。文件頭將包含有關文件的各種信息。到目前爲止,我們需要在文件頭中存儲的只有內容被刪除的第一個記錄的地址。我們用這第一個記錄來存儲第二個可用記錄的地址,依次類推。我們可以直觀地把這些存儲的地址看作指針,因爲它們指向一個記錄的位置。於是,被刪除的記錄形成了一條鏈表,經常稱爲空閒列表(free list)

變長記錄

變長記錄以下面幾種方式出現在數據庫系統中:

  • 多種記錄類型在一個文件中存儲。
  • 允許一個或多個字段是變長的記錄類型。
  • 允許可重複字段的記錄類型,例如數組或多重集合。

實現變長記錄存在不同的技術,任何這樣的技術都必須解決兩個不同的問題:

  • 如何描述一條記錄,使得單個屬性可以輕鬆地抽取。
  • 在塊中如何存儲變長記錄,使得塊中的記錄可以輕鬆地抽取。

一條有變長度屬性的記錄表示通常具有兩個部分:初始部分是定長屬性,接下來是變長屬性。對於定長屬性,如數字值、日期或定長字符串,分配存儲它們的值所需的字節數。對於變長屬性,如varchar類型,在記錄的初始部分中表示爲一個對(偏移量,長度)值,其中偏移量表示在記錄中該屬性的數據開始的位置,長度表示變長屬性的字節長度。在記錄的初始定長部分之後,這些屬性的值是連續存儲的。因此,無論是定長還是變長,記錄初始部分存儲有關每個屬性的固定長度的信息。
在這裏插入圖片描述

這個圖也說明了空位圖(null bitmap) 的使用,它用來表示記錄的哪個屬性是空值。在這個特定的記錄中,如果salary是空值,該位圖的第4位將置1,存儲在121912\sim 19字節的salary值將被忽略。由於記錄有4個屬性,儘管更多屬性需要更多字節,但該記錄的空位圖只佔用1個字節。在一些表示中,空位圖存儲在記錄的開頭,並且對於空屬性不存儲數據(值或偏移量/長度)。這種表示以抽取記錄屬性的額外工作爲代價來節省存儲空間。對於記錄擁有大量字段,並且大多數都是空的特定應用,這樣的表示特別有用。
在這裏插入圖片描述

我們接下來處理在塊中存儲變長記錄的問題,分槽的頁結構(slotted-page structure) 一般用於在塊中組織記錄,每個塊的開始處有一個塊頭,其中包含以下信息:

  1. 塊頭中記錄條目的個數。
  2. 塊中空閒空間的末尾處。
  3. 一個由包含記錄位置和大小的記錄條目組成的數組。

實際記錄從塊的尾部開始連續排列。塊中空閒空間是連續的,在塊頭數組的最後一個條目和第一條記錄之間。如果插入一條記錄,在空閒空間的尾部給這條記錄分配空間,並且將包含這條記錄大小和位置的條目添加到塊頭中。

如果一條記錄被刪除,它所佔用的空間被釋放,並且它的條目被設置成被刪除狀態(例如這條記錄的大小被設置爲-1)。此外,塊中在被刪除記錄之前的記錄將被移動,使得由刪除而產生的空閒空間被重用,並且所有空閒空間仍然存在於塊頭數組的最後一個條目和第一條記錄之間。塊頭中的空閒空間末尾指針也要做適當修改。只要塊中有空間,使用類似的技術可以使記錄增長或縮短。移動記錄的代價並不高,因爲塊的大小是有限制的:典型的值爲484\sim 8KB。

大多數關係數據庫限制記錄不大於一個塊的大小以簡化緩衝區管理和空閒空間管理。大對象常常存儲到一個特殊文件(或文件的集合)中而不是與記錄的其他(短)屬性存儲在一起。然後一個指向該對象的(邏輯)指針存儲到包含該大對象的記錄中。大對象常常表示我們的B+B^{+}樹文件組織。B+B^{+}樹文件組織允許我們讀取一個完整的對象,或對象中指定的字節範圍,以及插入和刪除對象的部分。

文件中記錄的組織

文件中組織記錄的幾種可能的方法:

  • 堆文件組織(heap file organization)。一條記錄可以放在文件中的任何地方,只要那個地方有空間存放這條記錄。記錄是沒有順序的。通常每個關係使用一個單獨的文件。

  • 順序文件組織(sequential file organization)。記錄根據其“搜索碼”的值順序存儲

  • 散列文件組織(hashing file organization)。在每條記錄的某些屬性上計算一個散列函數。散列函數的結果確定了記錄應放到文件的哪個塊中。

通常,每個關係的記錄用一個單獨的文件存儲。但是在**多表聚簇文件組織(multitable clustering file organization)**中,幾個不同關係的記錄存儲在同一個文件中。而且,不同關係的相關記錄存儲在相同的塊中,於是一個I/O操作可以從所有關係中取到相關的記錄。

順序文件組織

順序文件(sequential file) 是爲了高效處理按某個搜索碼的順序排序的記錄而設計的。搜索碼(search key) 是任何一個屬性或者屬性的集合。它沒有 必要是主碼,甚至也無須是超碼。

然而,在插入和刪除記錄時維護記錄的物理順序是十分困難的,因爲一次單獨的插入或刪除操作導致移動很多記錄是代價很高的。我們可以按照前面看到的那樣,使用指針鏈表來管理刪除。對插入操作,應用如下規則:

  1. 在文件中定位按搜索碼順序處於待插入記錄之前的那條記錄。
  2. 如果這條記錄所在的塊中有一條空閒記錄,就在這裏插入新的記錄。

多表聚簇文件組織

很多關係數據庫系統將每個關係存儲在單獨的文件中,以便它們可以利用操作系統所提供的文件系統的所有好處。通常,關係的元組可以表示成定長記錄。因此,關係可以映射到一個簡單的文件結構上。關係數據庫系統的這種簡單實現非常適合於廉價的數據庫實現,例如,嵌人式系統和便攜式設備中的數據庫實現。在這種系統中,數據庫的規模很小,因此複雜的文件結構不會帶來什麼好處。而且,在這樣的環境中,必須使數據庫系統目標代碼總量非常小。簡單的文件結構可以減少實現這個系統的代碼量。

然而,很多大型數據庫系統在文件管理方面並不直接依賴於下層的操作系統,而是讓操作系統分配給數據庫系統一個大的操作系統文件。數據庫系統把所有關係存儲在這個文件中,並且自己管理這個文件。

多表聚簇文件組織(multitable clustering file organization) 是一種在每一塊中存儲兩個或者更多個關係的相關記錄的文件結構,如圖10-14所示。這樣的文件組織允許我們使用一次塊的讀操作來讀取滿足連接條件的記錄。因此,我們可以更高效地處理這種特殊的查詢。

數據字典存儲

關於關係的關係模式和其他元數據存儲在稱爲數據字典(data dictionary)系統目錄(system catalog) 的結構中。系統必須存儲的信息類型有:

  • 關係的名字。
  • 每個關係中屬性的名字。
  • 屬性的域和長度。
  • 在數據庫上定義的視圖的名字和這些視圖的定義。
  • 完整性約束(例如,碼約束)。

此外,很多系統爲系統的用戶保存下列效據:

  • 授權用戶的名字。
  • 關於用戶的授權和賬戶信息。
  • 用於認證用戶的密碼或其他信息。

數據庫可能還會存儲關於關係的統計數據和描述數據。例如

  • 每個關係中元組的總數。
  • 每個關係所使用的存儲方法(例如,聚簇或非聚簇)。

數據字典也會記錄關係的存儲組織(順序、散列或堆),和每個關係的存儲位置:

  • 如果關係存儲在操作系統文件中,數據字典將會記錄包含每個關係的文件名。
  • 如果數據庫把所有關係存儲在一個文件中,數據字典可能將包含每個關係中記錄的塊記在如鏈表這樣的數據結構中。

數據庫緩衝區

數據庫系統的一個主要目標就是儘量減少磁盤和存儲器之間傳輸的塊數目。減少磁盤訪問次數的一種方法是在主存儲器中保留儘可能多的塊。這樣做的目標是最大化要訪問的塊已經在主存儲器中的機率,這樣就不再需要訪問磁盤。

緩衝區(buffer)是主存儲器中用於存儲磁盤塊的拷貝的那一部分。每個塊總有一個拷貝存放在磁盤上,但是在磁盤上的拷貝可能比在緩衝區中的拷貝舊。負責緩衝區空間分配的子系統稱爲緩衝區管理器(buffer manager)

緩衝區管理器

當數據庫系統中的程序需要磁盤上的塊時,它向緩衝區管理器發出請求(即調用)。如果這個塊已經在緩衝區中,緩衝區管理器將這個塊在主存儲器中的地址傳給請求者。如果這個塊不在緩衝區中,緩衝區管理器首先在緩衝區中爲這個塊分配空間,如果需要的話,會把其他塊移出主存儲器,爲這個新塊騰出空間。移出的塊僅當它自從最近一次寫回磁盤後被修改過才被寫回磁盤。然後緩衝區管理器把請求的塊從磁盤讀入緩衝區,並將這個塊在主存儲器中的地址傳給請求者。緩衝區管理器的內部動作對發出磁盤塊請求的程序是透明的。

緩衝區管理器必須使用比典型的虛擬存儲器管理策略更加複雜的技術:

  • 緩衝區替換策略(buffer replacement strategy)。當緩衝區中沒有剩餘空間時,在新塊讀入緩衝區之前,必須把一個塊從緩衝區中移出。多數操作系統使用最近最少使用(Least Recently Used,LRU)策略,即最近訪問最少的塊被寫回磁盤,並從緩衝區中移走。這種簡單的方法可以加以改進以用於數據庫應用。
  • 被釘住的塊(pinned block)。爲了使數據庫系統能夠從系統崩潰中恢復,限制一個塊寫回磁盤的時間是十分必要的。例如:當一個塊上的更新操作正在進行時,大多數恢復系統不允許將該塊寫回磁盤。不允許寫回磁盤的塊稱爲被釘住的(pinned)塊。儘管很多操作系統不提供對被釘住的塊的支持,但是這個特性對可從崩潰中恢復的數據庫系統十分重要。
  • 塊的強制寫出(forced output of block)。在某些情況下,儘管不需要一個塊所佔用的緩衝區空間,但必須把這個塊寫回磁盤。這樣的寫操作稱爲塊的強制寫出(forced output)。原因:簡單地說,主存儲器的內容,包括緩衝區的內容,在崩潰時將丟失,而磁盤上的數據一般在崩潰時得以保留。

緩衝區替換策略

對緩衝區中的塊替換策略而言,目標是減少對磁盤的訪問。對通用程序來說,精確預言哪個塊將被訪問是不可能的。因此,操作系統使用過去的塊訪問模式來預言未來的訪問。通常我們假定最近訪問過的塊最有可能再一次被訪問。因此,如果必須替換一個塊,則替換最近訪問最少的塊。這種方法稱爲最近最少使用(Least Recently Used,LRU)塊替換策略。

在操作系統中,LRU是一個可以接受的替換策略。然而,數據庫系統能夠比操作系統更準確地預測未來的訪問模式。用戶對數據庫系統的請求包括若干步。通過查看執行用戶請求所需操作的每一步,數據庫系統通常可以預先確定哪些塊將是需要的。因此,與依賴過去而預測將來的操作系統不同,數據庫系統至少可以得到短期內的將來信息。

爲了說明關於未來塊訪問的信息是如何使我們改進LRU策略的,考慮如下SOL查詢處理:

select *
from instructor natural join departmernt

假設所選擇的處理這個請求的策略下面的僞碼程序給出

for each instructor 中的元組 i do
	for each department 中的元組 d do
		if i [dept_name]=d[dept_name]
		then begin
			令x爲下列式子定義的元組:
			x[ID] :=i[ID]
			x[dept_name] :=i[dept_name]
			x[name] :=il name]
			x[building] :=d[building]
			x[budget] :=d[budget]
			將元組x包含進instructorI depurtment的結果中
		end
	end
end

假設該例子中的兩個關係存儲在不同的文件中。在這個例子中,我們可以看到,一旦instructor中的一個元組處理過,這個元組就不再需要了。因此一旦處理完instructor元組構成的一個完整的塊,這個塊就不再需要存儲在主存儲器中了,儘管它剛剛使用過。一旦instructor塊中最後一個元組處理完畢,就應該命令緩衝區管理器釋放這個塊所佔用的空間。這個緩衝區管理策略稱爲立即丟棄(loss immediate)策略

上述過程中塊替換的最優策略是最近最常使用(Most Recently Used,MRU)策略。如果必須從緩衝區中移除一個department塊,MRU策略將選擇最近最常使用的塊(當塊被使用時不能被替換)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章