5

5. 設定與規劃I/O 子系統

磁碟系統的特性

磁碟陣列概觀

I/O 子系統的觀念

常見的RAID層級概觀

RAID層級效能比較

I/O延遲與SQL Server

規劃SQL Server磁碟架構

I/O子系統的技巧與建議

本章總結

當您在設定系統時，要特別注意到 I/O 子系統的設計與設定。I/O 子系統的規劃要不對您的系統有所提升，便是降低整體的表現。若能確實了解 I/O 子系統的限制，並在伺服器上做好適切的規劃，您的系統便可提供理想的效能表現。

我們將在本章中探討 I/O 子系統。從磁碟運作及其效能限制等基本原理開始，接著介紹可運用的磁碟陣列方案以及各自的特色。此外，您也可以學到判別 I/O 效能問題，並進一步解決這些問題。本章也提供了一些 I/O 子系統的訣竅與建議。最後，我們將告訴您如何恰當地設定 Microsoft SQL Server 2000，好好的運用 I/O 子系統的效能。

磁碟系統的特性

磁碟(或說硬碟)是電腦系統中一個基本的元件。令人驚訝的是，近20年來磁碟系統幾乎沒什麼改變。比起過去，今日的磁碟或許更快更穩定，但基本上它們都是一樣的東西。

從效能的觀點來看，磁碟系統的調校是硬體元件最重要的關鍵。更正確的說，您不能調校您的磁碟；但若了解磁碟系統運作的原理與限制，並針對這些限制留心規劃您的系統，您是在調校您的 I/O 子系統。

磁碟系統的構造

磁碟機中用來儲存資料元件稱做磁碟片或磁盤。磁碟片上塗佈著可以儲存資料的磁性物質。資料儲存在磁軌上，所謂磁軌，看起來就像是黑膠唱片(或是CD，如果您不記得黑膠唱片長什麼樣子的話)上的音軌。每道磁軌上依序劃分著若干磁區，離磁碟中心越遠，磁軌所容納的磁區數就越多。圖5-1便是一個典型的磁碟片。

圖5-1　磁碟片

大部份的磁碟裡都有數片磁碟片，且是一片一片堆疊起來的，如圖5-2。讀取與寫入資料的部份稱做「讀寫頭」。由於有著數片磁碟片，讀寫頭往往也不止一個。連接讀寫頭的部份稱做「讀寫臂」，它可以讓讀寫頭在磁區上來回移動，有點像是唱機上連接唱針的搖臂。

讀寫頭與讀寫臂是固定連接的，造成的結果是，所有讀寫頭在磁碟片上的動作將會同進同出。換言之，所有讀寫頭在磁碟片上讀或寫的動作是同步的，資料不是同時被讀取就是同時被寫入。基於這種運作方式，讀寫頭是同時經過每片磁碟上相同的磁軌，這些磁軌堆疊起來就如圓柱，因此我們說資料是被儲存在「磁柱」上，就如圖5-2所示。

磁碟裡的磁碟片數量可以是一片，也可以多到超過六片，磁碟片的密度與數量決定了磁碟的容量大小。大部份的磁碟規格都差不多，不同的部份只在磁碟片的數量。較常見的是有三片磁碟片的9 GB磁碟與六片磁碟片的18GB磁碟。

圖5-2　磁柱

磁碟特性

現在您大概了解磁碟的構造，接著我們再來看看它是如何運作的。首先必須了解磁碟旋轉的特性，由此便能明白磁碟搜尋效能的癥結。

迴圈延遲

今日大多數高階磁碟已能達到每分鐘 10000 轉這種速度(10000rpm)。當有資料要求時，磁碟在讀到這個資料前需先旋轉至資料位置，這個轉動大概要花6毫秒(ms)，或說0.006秒。一顆10000 rpm的磁碟每秒旋轉166.7圈，亦即每圈花費1/166.7秒，或6 ms。

磁碟要讀取資料，則儲存資料的磁區必須位於讀寫頭之下。因為磁碟似乎永遠在旋轉，讀寫頭看起來就像是在等待磁區轉至它的位置。這段等待磁區旋轉至讀寫頭位置的時間，我們就稱做「迴圈延遲」（rotational latency）。如果磁碟是完整地旋轉一圈，迴圈延遲的長度為6 ms，但平均而言，它大概是3 ms左右。

迴圈延遲會增加磁碟存取的回應時間。因此，當您在為系統選擇磁碟時，從效能的觀點審慎考慮迴圈延遲的長度是非常重要的事。如剛剛所見，一顆每分鐘10000轉的磁碟，迴圈延遲約為3 ms。一般較舊型的磁碟每分鐘是7200轉，一圈約為8.3 ms，平均的迴圈延遲大概是4.15 ms。看起來似乎差別不大，但其實這個時間約比10000 rpm的磁碟多了38%。讀完本章您會發現，這38%將是系統 I/O 時間的一大負擔。

磁碟搜尋

當我們想從磁碟上取回資料時，不只需要磁碟機將磁區旋轉至讀寫頭底下讓它讀取資料，讀寫頭也必需移動至資料所位在的磁軌才行。讀寫頭是靠讀寫臂在磁碟片的夾層空間來回移動，移動至資料位在的正確磁柱所耗費的時間稱做「搜尋時間」（seek time）。圖5-3顯示了迴圈延遲與搜尋時間。

圖5-3　迴圈延遲與搜尋時間

搜尋時間的長短主要是依讀寫頭所需移動的距離而定。當磁碟存取動作是循序的，則讀寫頭僅需移動一點點距離，搜尋時間會比較短。相對的，若存取動作遍及整個磁碟，搜尋時間自然就會變得相當長。

搜尋時間與迴圈延遲都會增加 I/O 作業的時間，也會因此惡化磁碟的效能。在一顆10000 rpm磁碟上的迴圈延遲通常約3ms左右。搜尋時間則依磁碟的大小、速度以及搜尋時的狀況而有所不同。

Track-to-Track 搜尋 「Track-to-Track 搜尋時間」指的是讀寫頭在相鄰的磁軌間移動所需要的時間。這種型態的搜尋多半是執行循序性 I/O 作業的時候。以一顆典型的10000 rpm、9GB的磁碟來說，track-to-track 的搜尋時間大概是0.8 ms左右。您可以看到，0.8 ms的track-to-track 搜尋時間與約略3 ms的迴圈延遲，正是影響磁碟效能的最大因素。如果 I/O 作業要求傳送至磁碟的速度夠快，磁碟在相鄰磁軌之間的動作(不論是讀取或寫入)幾乎可同時完成。然而情況多非如此。某些狀況是，I/O 動作的要求不夠快，而磁碟是在每個循序存取之間旋轉。會不會出現這種問題，要看磁碟控制卡的設計與速度而定。

平均搜尋時間 「平均搜尋時間」指的是讀寫頭在隨機磁軌之間搜尋所耗費的時間平均值。依據磁碟規格表，一顆10000 rpm的磁碟的平均搜尋時間大概是6 ms左右。由於 SQL Server 的 I/O 作業大多隨機產生，您的磁碟也有許多執行隨機性 I/O 的機會。

這款磁碟的最大搜尋時間可以長到13 ms。所謂最大搜尋時間，指的是從磁碟片最內圈的磁軌移動至最外圈的磁軌所耗費的時間。這也被稱做 full-disk 搜尋。但一般來說，搜尋動作多半不會是 full-disk 搜尋，尤其當磁碟不是全滿的時候。

磁碟規格

在本節裡，您可以看到磁碟在執行不同的 I/O 作業時能達到多快的速度。要計算這些東西，您手上必須有更多資訊才行。大部份的資料可以從廠商提供的磁碟規格表裡找到。本章之前所舉的例子是一顆10000 rpm、9.1 GB的磁碟規格。在表5-1中可以了解此型磁碟其他的詳細規格。

表5-1　磁碟規格表

規格 | 值 | 說明
--- | --- | ---
磁碟容量 | 9.1 GB | 尚未format的磁碟容量
轉速 | 10,000 rpm | 磁碟的旋轉速度
傳輸速率 | 40 MBps | SCSI介面的速度
平均搜尋時間 | 5.2 ms (read) 6 ms (write) | 在隨機性 I/O 操作中，磁碟於磁軌間搜尋所耗費時間的平均值
Track-to-Track 搜尋時間 | 0.6 ms (read) 0.9 ms (write) | 在循序性 I/O 操作中，磁碟於磁軌間搜尋所耗費的時間
Full-disk 搜尋時間 | 12 ms (read) 13 ms (write) | 從磁碟最內圈到最外圈所耗費的搜尋時間
平均延遲 | 2.99 ms | 迴圈延遲時間的平均值
平均錯誤發 生間隔時間 | 1,000,000 hours | 一顆磁碟的平均壽命

如您所看到的，磁碟規格表上所載明的數據，有助於了解一顆磁碟真正的效能。

磁碟效能

I/O作業所需耗費的時間量來自於下列幾個因素：

- 必須的搜尋時間 (讓磁頭可以移動到資料所在的磁軌)
- 必須的迴圈延遲(讓資料可以轉至磁頭底下)
- 資料從磁碟傳送至磁碟控制卡的必須時間

因此，I/O 作業所需的時間其實是完成上述步驟的時間總合，加上磁碟與作業系統之間溝通所花費的時間。記住，I/O 作業的總時間與作業方式有莫大的關係。循序性 I/O 以 track-to-track 搜尋時間為準，隨機性 I/O 則是以平均搜尋時間而定。

循序性I/O

循序性 I/O主要是存取磁碟上相鄰的資料。因 track-to-track 搜尋時間遠比隨機搜尋時間來得快很多，所以此種作業方式可讓磁碟達到較高的生產力。要了解循序性 I/O 到底能多快，讓我們看看以下的例子。

以之前所提到磁碟來說，它的 track-to-track 搜尋時間近乎0.8 ms，加上迴圈延遲2.99 ms，您可以算出一個 I/O 動作大概要花掉3.79 ms左右。換言之，理論上在一秒之內可以執行264次循序性 I/O 作業(1000/3.79=263.8522....)。不過在實際情況裡，循序性 I/O 會受到其他因素的影響，如 SCSI 介面每秒 40MB 的傳輸率，以及作業系統的限制－如檔案系統、驅動程式等等。考量這些因素，磁碟所能負荷的循序性 I/O 最大速率約為每秒250次左右(要看這個作業多大而定)。在

第六章 裡您會看到磁碟的 I/O 量一旦超過85%就會產生瓶頸，因此，建議最大 I/O 速率估計值以每秒225次為宜。

隨機性I/O

隨機性 I/O 發生在磁頭必須於磁碟的不同部份讀取資料的時候。此種作業的結果是降低了 I/O的效能。同樣的，讓我們看看之前提到的例子。現在將 0.8 ms 的 track-to-track 搜尋時間換成7.5倍的6 ms平均搜尋時間。加上 2.99 ms 的迴圈延遲，一個隨機性 I/O 約要耗去 8.99 ms，也就是理論上每秒可執行111次隨機性 I/O(1000/8.99=111.2347...)。應用之前提到的法則，最大 I/O 速率估計值不得超過85%，也就是每秒94次 I/O 操作。如果再加上對控制單元的考量，則您的磁碟每秒最多不會超過85次 I/O 作業。

當磁碟在執行隨機性 I/O 時，正常的延遲時間(執行單次 I/O 作業)是 8.99 ms。若磁碟存取動作超過它所能掌握的速度，就會開始出現瓶頸，延遲時間就會增加。在圖5-4中可以看到，每秒運作次數越接近磁碟 I/O 速率的建議最大值，延遲就會越嚴重。

圖5-4　每秒I/O作業數與延遲的比較

事實上，如果您讓磁碟的操作達到滿檔，絕對會產生瓶頸且效能會劇降。您在之後會學習到， SQL Server(其他關聯性資料庫也一樣)對 I/O 延遲是相當敏感的。當 I/O 作業的完成必須耗費相當長的時間，SQL Server 的效能就會大大減低，且可能發生封鎖或死結的情況－因為 I/O 作業時，資源是處於鎖定的狀態，作業要多久完成，資源就會鎖定多久，如此便容易出現這類問題。

磁碟效能限制的解決方案

所以我們要怎麼做才能解決磁碟效能限制的問題？其實答案並不難。遵循底下的方針，您應該可以讓 I/O 系統有個理想的效能表現：

- 隔離循序性I/O作業 把本質上具有循序性的元件在磁碟區上有所分隔，便能維持它們本身的循序性。交易記錄檔就是具有循序存取性質的檔案。如果您在同一個磁碟區裡放有一個以上的循序性存取檔案，I/O 操作將會變成隨機的，因為磁碟必須先在不同的循序元件之中找到正確的對象才行。
- 分散隨機性I/O作業 由於這種 I/O 操作方式本質上是隨機的，您可以增加磁碟數量來減輕負荷。如果您有夠多的磁碟來掌握隨機性 I/O 的載量，大概就不會遇到什麼糟糕的問題。至於該裝多少顆磁碟以及該如何規劃它們，我們會在本章稍後及 第六章 說明。

  磁碟陣列概觀

  您可以想像得到，當系統增加了越來越多的磁碟，系統的管理也會變得越來越困難。與其添加數十顆甚至數百顆單獨的磁碟，許多使用者寧可選擇磁碟陣列(RAID, Redundant Array of Independent Disks)的方式來改善他們的系統。您可以利用軟體與現有的 I/O 元件來規劃磁碟陣列，也可以購買硬體的磁碟陣列裝置。在本節裡，您可以學到什麼是 RAID 以及它的運作方式。

  顧名思義，RAID 是兩顆以上的磁碟以陣列的方式組成。這個陣列雖然含有數顆實體磁碟，但在作業系統中卻僅是一顆「邏輯磁碟」（logical disk），也就是一個「磁碟區」（disk volume）。對使用者、應用程式甚至 Windows 2000(如果使用的是硬體RAID)都是如此。在多數情形中，這顆單一的邏輯磁碟比起任何您能買得到的磁碟都要大很多。RAID 不僅能讓您擁有一個超大容量的邏輯磁碟，許多不同種類的 RAID 層級(RAID的規劃)都提供了磁碟容錯的能力，即使陣列中的某個磁碟意外損壞，RAID 依然能夠繼續運作。在稍後的幾個章節裡，您會了解這種容錯能力的來由以及一些不同 RAID 層級的特性。

  之前已經提到，RAID 可以利用軟體來規劃，事實上，Windows 2000 就能做得到。不過，在本章中將探討的是硬體基礎的 RAID 層級，因為它們可以提供額外的附加功能。接下來的兩個章節裡，您可以學到不同的 RAID 層級提供的功能與特色。

  I/O 子系統的觀念

  硬體 RAID 控制卡不止提供了 RAID 的基本能力。大部份常見的硬體 RAID 都內建有控制卡快取。在本節裡，您可以學到關於控制卡快取、磁碟快取等知識以及內部 RAID 與外部 RAID 的差異。此外，您也可以了解最近的 I/O技術：Storage Area Network。本節涵蓋了各式各樣有關 RAID 控制卡與磁碟的問題，也包括了頻寬的討論。

  快取控制

  為了改善 I/O 的效能，許多廠商在控制卡裡裝有快取(caches)。「控制卡快取」指的便是裝置在控制卡裡的 RAM。快取記憶體有兩個目的：

- 寫入快取 因為控制卡上有記憶體，當資料被寫入快取時，控制卡便能告知作業系統(以及隨後的 SQL Server)I/O 動作已經完成，如此等於增加了寫入的效能。
- 預讀快取 控制卡快取的另一個用處是，讀取超出要求的更多資料。這是預期額外的資料可能很快會被要求取用。果真如此的話，回應時間會有戲劇化的縮短。

  往後的章節裡您會發現，寫入效能是相當具有決定性的因素，尤其是使用 RAID 5 的層級。多數的情況裡，控制卡快取是一大好處。不過，仍要注意以下兩點：

- 不要在沒有備用電力的情況下使用寫入快取。大部份的控制卡會內建一顆電池或提供類似的功能選項。當電力失效的事件發生時，這顆電池能將資料保存在快取裡。沒有這顆電池，則快取的資料將會流失，資料庫就有毀損的可能。
- 比較罕見的情形是在 RAID 快滿的時候，寫入快取將會嚴重影響讀取的效能。這是因為之前的寫入程序可能已經將快取佔滿的緣故。

  控制卡快取在可靠的情況下確實能增進 I/O 子系統的效能。當您了解了不同的 RAID 層級以及它們的效能特性，您便能設定控制卡，以求執行特定的應用程式與要求的最佳效能。

  磁碟快取

  大部份的磁碟都內建有快取記憶體。這份快取比控制卡快取要小得多。它可以一次掌握一些要求，讓磁碟自行排序。不過，因為這份快取實在不大(通常只有幾 KB)，因此無法預讀大量的資料。許多 RAID 控制卡或 SCSI 控制卡的廠商並不允許您去修改磁碟快取的狀態，不過，有些 RAID 製造商讓您可以決定是否關閉這部份快取的功能。

  內接式與外接式RAID

  RAID 系統有兩種基本型態：內接式 RAID 與外接式 RAID。內接式與外接式，主要是依 RAID邏輯駐留方式的設計而定。大部份系統的 RAID 邏輯常駐在控制卡內，也就是主機裡安裝的 RAID 控制卡上。此即內接式 RAID。外接式 RAID 的 RAID 邏輯則是常駐於磁碟上的儲存單元裡，圖5-5顯示出這兩種不同的系統。每一種方式都有其各自的屬性與特色，不過其間的差異並非本章的重心。

  圖5-5　內接式與外接式RAID

  在下一節裡，您可以學到不同 RAID 層級的相關知識。這些層級進一步區分出 RAID 控制的差異性。

  區域儲存網路（Storage Area Networks）

  「區域儲存網路」 (SAN)是市面上最新的技術之一。SAN 基本上是一個可以在數個系統之間分享儲存空間的大型外接式 RAID。這也是為什麼在名字裡有 network 這個字眼的緣故。當您從控管中心對系統進行管理與支援工作時，SAN 可以集中儲存空間並降低花費。

  SAN 的觀念是相當有前瞻性的。一個外接式 RAID 系統主要是靠連接一張主機匯流排控制卡(HBA)來導向 RAID 子系統。就如圖5-6看到的，SAN 透過一個交換器（swich）將多張 HBA 連接起來，導向（至少）一個外接式 RAID 系統。這種設計可以讓 SAN 上的各個系統均能對 RAID 子系統進行存取動作。

  圖5-6　SAN 系統

  在本書寫作之時，多重不同的系統還無法透過 SAN 來分享一個邏輯磁碟。SAN 的軟體會將儲存單元分割，而邏輯磁碟機則被分派到指定的系統上。無論如何，SAN 提供了幾個優點：

- 叢集化 SAN 可以簡單地被叢集起來，因為它本身即是一個外接式 RAID 控制器。伺服器可以分享到所有 RAID 的好處。
- 集中儲存 有一個儲存功能的核心便可以降低維護儲存系統時所產生的問題。
- 降低空間浪費 您可以將多餘的空間放在數個系統中更具生產性的用處上，而不是將額外的磁碟機單獨保留給每個系統。
- 容錯 在 SAN 上存取的所有系統均能分享線上備用空間，如此便可在磁碟機故障時立即替換。

  控制卡及匯流排的頻寬問題

  就磁碟限制而論，您尚須考慮的另外一個問題便是 I/O 匯流排（通常是 SCSI 或光纖通道）的頻寬大小。匯流排有一定的時脈速度與資料寬度（32bits、64bits 等），因此最大流量是固定的。您的需求可能剛好符合甚或超過控制卡(PCI 介面或其他 I/O 匯流排控制卡)的頻寬。要避免這種問題，您可以將控制卡分裝在系統中不同的 PCI 匯流排上。大部份新型的電腦系統均內含三個以上的 PCI 匯流排。

  高階 I/O 子系統

  對於那些要求最大效能（系統執行時間最佳化至99.99%以上）的公司而言，通常會將儲存問題交給像是 EMC 這類儲存廠商。這些儲存系統公司提供精密的 I/O 子系統，包括以十億位元組(gigabytes)為單位的快取空間，及電腦到磁碟之間多重的資料路徑（傳輸管道）。多重傳輸管道提供了多一層的保障─如果系統某個元件（可能是 I/O 管道、控制卡或快取）出了問題，子系統依然可以繼續運作。如果您對這些問題斤斤計較，這類提供高階效能的子系統是相當值得信賴的。

  電梯式排序

  「電梯式排序」（Elevator sorting）是一種可以讓隨機性 I/O 作業更有效率的方法。當隨機性 I/O要求傳送至磁碟，讀寫頭必須在磁碟片上隨機地移進與移出，如我們之前所提到的，這種隨機性作業會造成延遲。許多 RAID 控制卡支援電梯式排序來讓隨機搜尋更有效率。在這類型 RAID 中，當多個 I/O 作業停留在控制卡的佇列時，這些作業可以被排序以降低讀寫頭的移動量。電梯式排序的優點就類似人們利用電梯從一個樓層移動到另一個樓層。

  想像在一所電梯大樓裡，人們在電梯中按下按鈕的情境。電梯可以越過好些個樓層，而人們可以有效地選擇他們要前往的樓層。一部真正的電梯會更有效率是因為它可以在真正有需要的地方停留下來。電梯式排序演算法也是做同樣的事。如果在佇列裡有一個以上的 I/O 作業要求，控制卡可以找到清空佇列的最佳途徑，如圖5-7所示。

  圖5-7　電梯式排序

  如您所見，電梯式排序可以提升磁碟搜尋的效率。整體的搜尋時間可以減少─也許犧牲了某些個別的搜尋時間。不過，要讓磁碟開始電梯式排序，您必須有數個甚或更多尚未解決的 I/O 作業停放在控制卡或磁碟上。這種狀況在 I/O 子系統超載時會相當常見。一般說來，理想的磁碟運作是僅有一個或兩個尚未解決的 I/O 作業，讓電梯式排序無用武之地。

  磁碟可靠度

  磁碟機是電腦系統中少數具有部份機械結構的元件之一。磁碟在高速及高溫的狀況下旋轉，馬達與軸承這類零件遲早有壽終正寢的一天。在磁碟機規格表內是以「平均錯誤發生間隔時間（mean time between failures，MTBF）」來表示磁碟的壽命。這個持久時間的預估是一個平均值。換言之，即使大家的 MTBF 都一樣，有些磁碟機仍然可以用得更久。一顆典型磁碟機的 MTBF 可能長達1,000,000個小時，也就是114年。這可是一段相當長的時間，不過有些磁碟機會較為長壽，有些則會比較短命。重點是磁碟機內有機械裝置，它們會被磨損也會有終將停擺的時候。

  常見的RAID層級概觀

  RAID 最主要的特徵是兩顆以上的實體磁碟合併成一個邏輯磁碟，在 Windows 2000（以及終端顯示器）上看起來就只是一個磁碟。邏輯磁碟可以有數百 GB 的容量，即使 100GB 的硬碟尚不存在於世上。

  此處即將提到的 RAID 層級大多數會應用到「資料分割」（data striping）的技術。資料分割可以將資料分割成數個片段分別儲存在 RAID 邏輯磁碟裡的每個磁碟上，使用時再將它們合併起來。分割的每個部份猶如「資料帶」或「資料區塊」。資料帶的大小是由控制卡決定的。有些控制卡允許您自定資料帶的大小，有些則是固定值。

  存在於各個磁碟上的資料片段可以視作帶狀或塊狀，不過組合後仍統稱為「資料帶」，就如圖5-8所看到的。

  因此，「資料帶」可以用來描述特定磁碟上的資料片段，一如「磁碟帶」，或是指相關資料的集合，如「陣列帶」。當您在閱讀本章或其他與 RAID 相關的文件時，請特別留心這一點。

  比之內部與外部 RAID 邏輯，RAID 層級更能顯現出不同的 RAID 陣列規劃各自的特徵。其中最重要的特徵之一便是「容錯」（fault tolerance）。容錯功能可以讓 RAID 系統在某顆磁碟故障時仍能持續運作。容錯也是 RAID 控制卡的主要用途。正因為您的資料相當珍貴，因此您必須預防磁碟的錯誤可能造成的損失。在本節裡，您將學習到一些常見的 RAID 層級：它們如何運作、支援哪種等級的容錯功能，以及它們能有多快的效能。有些其他的 RAID 層級目前並不常使用，而此處將只介紹最為常用的幾種。

  圖5-8　RAID資料帶

  RAID 0

  RAID 0 是最基本的 RAID 層級，僅提供磁碟資料分割的功能。資料區塊可以建立在每個磁碟機上，大小由控制卡定義。如圖5-9所示，RAID 0 利用一個循環的方法將資料分散到每一磁碟上的每個區塊，從而建立一個龐大的邏輯磁碟。

  圖5-9　RAID 0

  雖然 RAID 0 在技術上可以說是一種 RAID，但在這個層級裡並沒有「磁碟重複」（「redundancy」）上的意義。因為沒有重複，也就沒有容錯。如果 RAID 0 陣列裡有某個磁碟故障了，則資料將會遺失。一部磁碟的故障，對資料的破壞性就會像是本書裡的每一句話都失去了第四個字一般。這種部分資料闕漏的結果，會使得陣列毫無用處。

  RAID 0 建議

  通常不建議用 RAID 0 來儲存 SQL Server 的資料檔案。資料庫內的資料對您的企業而言是如此重要，資料損失可能會造成嚴重的傷害。RAID 0 無法保護您免於磁碟故障的威脅，因此您不應將它使用在關鍵性的系統元件上，例如作業系統、交易記錄或資料庫檔案。

  說明

  磁碟機是是一種機械元件，且在高速、高溫的狀態下運轉與作業。換言之，它終究有故障的時候。因此，建立一個容錯系統來保護 SQL Server 資料檔案是相當重要的。

  RAID 1

  RAID 1 是最基本的容錯 RAID 層級。RAID 1，也被稱作「鏡像備份」（mirroring），可以建立資料磁碟的複本。如圖5-10所示，此複本包含了所有存在於原始磁碟內的資訊。當磁碟發生錯誤時，鏡像備份將完全替代故障的磁碟；如此一來，您將不會遺失任何資料。所有的資料都保存在一顆硬碟（以及它的鏡像備份）裡，因此沒有資料分割的問題。RAID 1 以第二個磁碟來複製第一個磁碟，換言之，RAID 1 磁碟區空間總合將只等於一個磁碟的空間。由此可知，RAID 1 是相當昂貴的－您必須有兩倍的硬碟數量來滿足需求，且系統回復後將沒有多餘的磁碟空間可用；不過，您卻能有一個極佳的容錯保障。

  圖5-10　RAID 1

  就一個 RAID 1 磁碟區而言，I/O 作業在控制器尚未將資料完全寫入原始磁碟與備份磁碟之前，系統並不認為此 I/O 已執行完畢，如此才能保障系統容錯可以達到資料完全不遺失的目標－唯有確定資料已完整寫入兩份磁碟，才能在某個磁碟故障時，有來自另一個磁碟的相同資料可以彌補這種錯誤。這種方式意謂著如果某個磁碟寫入資料的時間比另一個磁碟寫入相同資料的時間長，則 I/O 作業的延遲時間將以兩個磁碟中延遲時間較長的那個來計算。

  這種必須將資料寫入兩部磁碟的情形，降低了整個邏輯磁碟的效能。當我們在計算會有多少個 I/O 作業到達陣列裡的每個磁碟時，您必須把寫入的數量乘以二。讀取只會發生在一個磁碟上。由於某個磁碟機的讀寫頭目前位於哪個磁軌上可能跟另一部磁碟機的讀寫頭不同，磁碟機可能以不同的速率工作。換言之，搜尋動作會耗去較長的時間。磁碟機讀寫頭位置不同的情形，主要是因為 RAID 1 有一種被稱作「分離搜尋」（split seeks）的執行特色。

  分離搜尋允許 RAID 1 磁碟區裡的磁碟機可以個別的、獨立的讀取資料。之所以能執行這種分離搜尋，乃是因為讀取動作一次只發生在磁碟區裡的一部磁碟機上。大部分的控制卡製造商都支援分離搜尋。由於 I/O 量可以分散到兩個磁碟而不是由單一的磁碟機來承擔，分離搜尋對陣列的效能會有所幫助。不過，正因為磁碟機的讀寫頭可獨立作業，但寫入時卻必須兩部磁碟機都執行相同的寫入動作，整體的寫入延遲就得以兩部磁碟機中較長的那個延遲時間為主。

  RAID 1建議

  RAID 1 提供極佳的容錯功能與執行效能。當我們只要使用一部磁碟機即能掌握全部資料的時候，RAID 1 是最佳的解決方案。RAID 1 的使用建議如下：

- 在包含作業系統的磁碟上使用 RAID 1，因為重建作業系統是相當耗時費力的工作。RAID 1 之所以是個好的選擇，是因為作業系統通常使用一部磁碟機即可完全安裝。
- 使用 RAID 1 來儲存交易記錄。同樣的，SQL Server 的交易記錄也是一部磁碟即能容納。此外，交易紀錄多半執行循序性的寫入動作，只有在回復作業時會有讀取的情形。因此，您可以將交易記錄獨立在各自的 RAID 1 磁碟區裡，藉以達到高速率的執行效能。
- 在 RAID 1 磁碟區裡使用寫入快取。因為 RAID 1 的寫入動作必須在兩次寫入都完成時才算結束，透過寫入快取的使用可以保障其寫入的效率。使用寫入快取時，要注意備用電力是否正確的伺機以待。

  本章稍後您將會看到，如果需求超過一部磁碟，您可使用其他的容錯方案。只有在容錯是必須的且一部磁碟即可滿足需求時，RAID 1 是最好的方式。

  RAID 5

  RAID 5 是一種利用「同位」（parity）來保護資料的容錯 RAID 層級。每個陣列資料帶會建立同位資訊在資料帶上的某個磁碟裡。此同位資訊可與陣列資料帶上的其他磁碟一起運算，從而重建資料帶上其他任何一部磁碟機上的資料。如此一來，RAID 5 便可以容許陣列上某一部磁碟錯誤造成的資料遺失。同位資訊是以循環的方式儲存於陣列裡不同的磁碟機上，如圖5-11所示。

  圖5-11　RAID 5

  RAID 5 的優點是在此 RAID 層級裡可用的磁碟空間是 n-1 個磁碟機的總合，n 為陣列裡的磁碟總數量。如此一來，由10部磁碟機組成的 RAID 5 磁碟陣列將有9部磁碟機的容量，可說是相當經濟的容錯選擇。

  不幸的是，RAID 5 相對上便有效能不彰的缺點。維護同位資訊需要消耗額外的系統時間。當資料寫入 RAID 5 陣列時，必須先讀取目標磁碟資料帶與同位資料帶，計算同位資訊，然後再將資料寫入兩個資料帶。因此，一個 RAID 5 的寫入動作事實上是四次的 I/O 作業。

  RAID 5的同位性

  在 RAID 5，同位位元是建立在所有磁碟的每個資料帶的資料上。同位位元是資料附加的部分－當一串位元產生時，同位位元可決定其他的位元為何。同位位元主要是依其他位元的總合來建立，並且同位位元的值（0或1）要依同位基準為偶數或奇數來決定。當某個位元遺失，利用同位位元與剩餘的位元來計算便可得出遺失位元的值。

  讓我們來看一個同位位元運作的例子。在這個例子裡，我們假設現有一個以5部磁碟組成的 RAID 5 系統。每部磁碟機均已建有一定數量的位元，從磁碟上資料帶的第一個部分開始並結束於磁碟上資料帶的最後一部份。同位位元是以每一磁碟上的位元為基礎來建立的。

  本例中，我們假設同位基準為偶數，換言之，所有位元的總合必須為0。如果第一部磁碟的第一個位元為0，第二部磁碟的第一個位元為1，第三部磁碟的第一個位元為1，第四部磁碟的第一個位元為1，則同位位元必須為1才能使位元總合為偶數，如表5-2所示。

  表5-2 　RAID同位位元範例

  磁碟 1 位元 1 | 磁碟 2 位元 1 | 磁碟 3 位元 1 | 磁碟 4 位元 1 | 磁碟 5 同位位元 | 位元總合
  --- | --- | --- | --- | --- | ---
  0 | 1 | 1 | 1 | 1 | 4 (偶數)

  所以，稍微思考一下在單一位元建立同位檢查的意義。雖然磁碟資料帶上可能包含無數位元，但您只要在單一位元建立同位性便可讓資料回復原貌。

  就如您在表5-2所看到的，同位性實際上只建立在資料帶上獨立的位元。即使磁碟損壞的資料區塊或資料帶可能是64KB或超過64KB，但如此處所示，我們在位元階段即已建立其同位性。事實上，同位檢查是以一種更精密的演算法則來計算的。

  現在，假設磁碟3故障了。在這種情形下，因為總合必須是一個偶數，同位位元只要加上其他尚可使用的位元，便可回復磁碟3上失去的位元。

  建立同位性

  就如您所看到的，RAID 5 產生同位性的方法，是先找到陣列裡所有磁碟機相同位置的位元的總合，再依此建立同位位元，以使總合結果為偶數。您可以想像得到，如果每次 I/O 作業時，控制卡都必須到所有磁碟讀取所有資料，這是相當不切實際的做法。效能既差，速度也慢。

  當 RAID 5 建立時，資料是歸零的，且同位位元已開始建立。您的 RAID 5 磁碟集合將沒有資料但卻有整組齊全的同位位元。

  重點在於，當資料要寫進磁碟時，資料磁碟與同位磁碟必須先被讀取。新的資料與舊的資料做比較，如果某一特定位元被改變了，則同位將因此位元而有所改變。這個過程是以互斥的 OR（XOR）運算來完成。如此一來，僅需讀取資料磁碟與同位磁碟，而不是所有磁碟都需讀取。當此運算完成，資料磁碟與同位磁碟都需有寫出的動作，因為同位作業將影響整個資料帶。因此，每有資料寫入 RAID 5 磁碟區時，會導致四個實體 I/O 作業：兩次讀取（一次讀取資料，一次讀取同位資訊），兩次寫入（寫回資料及寫回同位資訊）。不過在 RAID 5 陣列中，同位資訊是分散的，因此 I/O 量可以平均分攤到陣列裡的每部磁碟。

  RAID 5建議

  由於在 RAID 5 的寫入動作將會造成額外的 I/O 作業，此 RAID 層級建議用在多數執行讀取動作的磁碟區。因為同位資訊分散於陣列裡不同的磁碟中，所有磁碟都可用來進行讀取動作。基於這項特點，我們的建議如下：

- 在唯讀磁碟區中使用 RAID 5。任何磁碟區有超過 10% 的寫入需求時就不該使用 RAID 5。
- 在 RAID 5 磁碟區使用寫入快取。因為 RAID 5 的寫入動作要到兩讀兩寫都完成時才算結束，透過寫入快取的使用可以改善寫入的回應時間。（使用寫入快取時，要確定備援電力是否正常。）然而，寫入快取並不是讓您的硬碟能長期超速驅動的藥方，您仍然必須持續注意這些磁碟的容量。

  如您所見，雖然 RAID 5 相當經濟，但卻必須付出效能的代價。本章稍後您會看到這個代價將有多高。

  RAID 10

  RAID 10 是 RAID 0 與 RAID 1 的綜合體。RAID 10 內含有磁碟資料帶的鏡像備份。每個磁碟都有其複本，但每個磁碟裡只包含有資料的一部份，如圖5-12所示。這個層級能提供 RAID 1 的容錯功能及 RAID 0 在便利與效能上的優勢。

  如同 RAID 1，每個 RAID 10 寫入動作會造成兩次實體 I/O 作業－有一次是寫入鏡像備份裡的磁碟。因此，當計算每個磁碟的 I/O 作業數量時，您必須將寫入動作乘以2。另一個與 RAID 1 相同的特點是，RAID 10 的 I/O 作業要到兩次寫入都完成時才算結束，因此，寫入延遲將會增加。不過，一如 RAID 1，多數控制卡在 RAID 10 都支援分離搜尋。

  RAID 10 提供高階的容錯功能。事實上，即使故障的硬碟超過一個以上，陣列仍可存活下去。當然，鏡像備份與原始資料都遺失的話，資料將無法彌補。如果鏡像備份是分開存放於所有的磁碟櫃，則即使某一磁碟櫃整個闕漏了，容錯依然可發揮它的作用。

  圖5-12　RAID 10

  RAID 10 建議

  RAID 10 提供高階的效能與容錯。當我們需要一個大型的磁碟區且寫入 的I/O 作業超過10%的時候，應該使用 RAID 10。RAID 10 的相關建議如下：

- 當陣列的寫入作業有超過 10% 狀況時使用 RAID 10。對於大量的寫入動作，RAID 5 的效能將無法跟 RAID 10 相提並論。
- 當效能問題成為系統關鍵時使用 RAID 10。RAID 10 支援分離搜尋，您將可獲得優值的效能表現。
- 在 RAID 10 磁碟區使用寫入快取。因為 RAID 10 的寫入動作必須在兩次寫入都完成時才算結束，透過寫入快取的使用可以改善其寫入的效能。寫入快取只有在備援電力已正確連接快取時才是安全的。

  從保護與效能的觀點來看，RAID 10 是最佳的容錯方案，不過它也相當昂貴。您必須購置兩倍於 RAID 0 所需求的磁碟數量。如果您的磁碟區以讀取動作為多，RAID 5 可能是較可以接受的選擇。

  RAID層級效能比較

  要正確的規劃與調校您的 RAID 系統，您必須了解不同的 RAID 層級在效能上的差異。只要明白 RAID 系統如何運作及其在不同狀況下的執行方式，您便能將 I/O 子系統調校得更好。您在前一節所看到不同的效能特色，本節將更詳細的加以比較。

  讀取效能

  您所選擇的 RAID 層級對讀取效能將不會有顯著的影響。當 RAID 磁碟區執行讀取作業時，每個磁碟都對磁碟區的效能都有所助益。由於隨機性 I/O 作業是大多數效能問題的癥結，這類困擾在此將可得到解決。您可以將循序性 I/O 作業分開獨立在各自的磁碟區內，讓循序性執行能有最大的發揮。以下是在不同 RAID 層級裡隨機讀取的效能說明：

- RAID 0 磁碟區將資料平均分割在陣列裡所有的磁碟中。因此，隨機性 I/O 作業應該也是平均地分攤給系統裡的所有磁碟。如果我們預估一部磁碟每秒約可掌握 85 個隨機性 I/O 作業，那麼一個由10部磁碟組成的 RAID 0 陣列每秒應可掌握850個隨機性 I/O 作業。
- RAID 1 磁碟區支援分離搜尋，因此可以有兩部磁碟同時執行讀取作業。換言之，RAID 1 可以支援兩倍於一部磁碟所能做到的讀取作業數量，也就是每秒170個 I/O 作業。如果讀取動作比此更為頻繁，則效能將會變得很糟。
- RAID 5 陣列將資料平均分割在陣列裡所有的磁碟中。在每個分割中把一個磁碟當作同位元。因為 I/O 動作是任意的，因此所有磁碟皆會使用到。RAID 5 陣列的讀取資料效率是 RAID 0 陣列的85%，多少會影響 SQL server 的效能。

  RAID 10 陣列，就如同 RAID 1 陣列，支援分離搜尋的功能。因此其最大效能等於磁碟總數量乘以每秒85個 I/O 作業。您也許會在初始規劃上投入更為頻繁的 I/O 作業，但它們將不會如您設想般那麼快完成整個 I/O 動作。

  如您所見，一個 RAID 陣列的讀取容量是相當容易計算的。只要增添足夠的磁碟來應付您的 I/O需求，並且留心這些限制，您將可以讓系統順利的最佳化。

  寫入效能

  您使用的 RAID 控制卡類型將對寫入效能有戲劇性的影響。同樣的，隨機性 I/O 作業是大多數效能問題的癥結，這些關鍵在此也會有所討論。您可以將循序性 I/O 作業分開獨立在各自的單一或多個磁碟區內，讓循序性執行能有最大的發揮。以下是在不同 RAID 層級裡隨機寫入的效能比較：

- RAID 0 是最能掌握寫入作業而不造成效能降低的 RAID 層級，但卻無法擁有容錯功能。由於 RAID 0 既沒有鏡像備份也不使用同位檢查，其效能單純的來自每個磁碟個別的總合。亦即，一個由 10 個磁碟組成的 RAID 0 陣列每秒可操作 850 個隨機寫入。
- RAID 1 陣列必須對所有寫入陣列的資料進行鏡像備份的工作。因此，一個單一的寫入陣列的作業，磁碟將產生兩次 I/O 作業。故一個 RAID 1 陣列只有一個單一磁碟的容量，即每秒 85 個 I/O 作業。
- RAID 5 在寫入作業的表現上更為緩慢。一個 RAID 5 的寫入作業實際上會產生兩個從磁碟讀取的動作及兩個寫進磁碟的動作。亦即，一個寫入到 RAID 5 陣列的作業將造成磁碟上四個實體 I/O 作業。因此，RAID 5 陣列的寫入容量等於陣列內磁碟機寫入容量的四分之一。
- RAID 10 與 RAID 1 陣列有相同的寫入特色。每個寫入到 RAID 10 的作業產生兩個實體的寫入動作。因此，RAID 10 陣列的寫入容量等於陣列內磁碟機寫入容量的二分之一。

  如您所見，計算一個 RAID 陣列的寫入容量是相當複雜的事。只要增添足夠的磁碟來應付您的I/O 需求，並且留心這些限制，您將可以讓系統順利的最佳化。在下一節，您將會了解如何計算不同情況下每磁碟的 I/O 作業數量。

  磁碟計算

  要確定系統中每顆磁碟個別擔負的載量，您必須做一點計算。如果您使用的是硬體 RAID 控制卡，您在效能監測面板上所讀到的每秒 I/O 作業量是指到達陣列的 I/O 作業量。控制卡因容錯而產生的額外 I/O 作業量並沒有顯示出來。事實上，Windows 2000 裡也沒有可以了解這些數據的介面，但您卻必須意識到這些額外的部分確實存在，且必須依據這些數據來決定需要多少部磁碟機才能達到理想的效能。底下所列的一些計算式可以幫助您測定到底有多少 I/O 作業實際到達您陣列裡的每個磁碟：

  RAID 0

  RAID 0 陣列裡每磁碟 I/O 作業率的計算方法是先將陣列的讀取數量與寫入數量加總，再除以陣列裡的磁碟總數量。RAID 0 僅需以下簡單的公式即可算出其 I/O 作業率：

      每磁碟作業數量＝（讀取數量＋寫入數量）÷磁碟數量

  RAID 1

  RAID 1 的計算稍微有點複雜。由於寫入量需要加倍，每磁碟 I/O 作業數量等於寫入數量乘以二再加上讀取數量，然後除以陣列裡的磁碟數量（RAID 1 陣列為2個磁碟）。公式如下：

      每磁碟作業數量＝（讀取數量＋（2×寫入數量））÷磁碟數量

  RAID 1 在寫入上較為緩慢但卻能提供高階的容錯功能。

  RAID 5

  RAID 5 提供容錯，但寫入作業卻會耗去不少時間。RAID 5 的讀取同樣分散給陣列裡不同的磁碟，但寫入作業實際上是四個實體 I/O 作業。要計算每個磁碟個別的 I/O 作業數量，您必須將寫入數量乘以四再加上讀取數量，然後除以陣列裡的磁碟數量。因此，RAID 5 的公式如下：

      每磁碟作業數量＝（讀取數量＋（4×寫入數量））÷磁碟數量

  RAID 10

  RAID 10 就如同 RAID 1 一樣，在寫入上較慢但可提供高階的容錯功能。RAID 10 的計算方法與 RAID 1 相同。由於寫入量加倍，每磁碟 I/O 作業數量等於寫入數量乘以二再加上讀取數量，然後除以陣列裡的磁碟數量。公式如下：

      每磁碟作業數量＝（讀取數量＋（2×寫入數量））÷磁碟數量

  RAID 比較

  讓我們直接將各種 RAID 層級做個比較。這個方式可能更有助於您決定哪種 RAID 層級是您系統的最佳選擇。當您在比較這些 RAID 層級的 I/O 效能時，其中一個最重要的因素是讀取數與寫入數的比率。這些不同的 RAID 層級在讀取的執行上大多相等，只在寫入效率上有所不同。您也應該考慮您的系統是否需要容錯。最後，您應斟酌「價格／空間」的比率。表5-3總結了這些不同的 RAID 層級。

  表5-3　RAID層級比較

  RAID層級 | 效能 | 容錯 | 價格
  --- | --- | --- | ---
  RAID 0 | 最佳 | 無容錯功能 | 經濟
  RAID 1 | 佳 | 佳 | 昂貴
  RAID 5 | 讀取快速，寫入緩慢 | 良 | 最經濟的容錯
  RAID 10 | 佳 | 佳 | 昂貴

  您會發現，您的最佳選擇來自於您的需求。要了解 RAID 5 與 RAID 10 之間在不同的「讀取／寫入」比率上的差異，可參考以下的表格。表5-4以10部磁碟，每秒500個 I/O 作業總量為例，顯示不同「讀取／寫入」比率下兩者的差異：

  表5-4　RAID 5與RAID 10 比較表

  「讀取／寫入」比率 | RAID 5 I/O作業（讀取數量＋（4×寫入數量））÷磁碟數量 | RAID 10 I/O作業（讀取數量＋（2×寫入數量））÷磁碟數量
  --- | --- | ---
  100% 讀取 0% 寫入 | (500 + 0)/10 每磁碟I/O作業數 50 | (500 + 0)/10 每磁碟I/O作業數 50
  90% 讀取 10% 寫入 | (450 + 200)/10 每磁碟I/O作業數 65 | (450 + 100)/10 每磁碟I/O作業數 55
  75% 讀取 25% 寫入 | (375 + 500) / 10 每磁碟I/O作業數 87.5 | (375 + 250) / 10 每磁碟I/O作業數 62.5
  50% 讀取 50% 寫入 | (250 + 1000) / 10 每磁碟I/O作業數 125 | (250 + 500) / 10 每磁碟I/O作業數 75
  0% 讀取 100% 寫入 | (0 + 2000) / 10 每磁碟I/O作業數 200 | (0 + 1000) / 10 每磁碟I/O作業數 100

  您會發現，在比率為 90% 讀取、10% 寫入之前，磁碟的使用效率還算順利；但隨著寫入比率逐漸增加，RAID 5 需要耗費的時間就越長。

  I/O延遲與SQL Server

  由於 SQL Server 引擎內部經常是同時進行多起交易，SQL Server 對 I/O 延遲是相當敏感的。在一般狀況下，一個 SQL Server 資料庫常需面對數十或數百個正在執行的應用程式。要支援這種同時性，SQL Server 有著一套鎖定資料列、分頁、範圍及資料表的複雜系統。當部分資料或 SQL Server 資源被鎖定時，其他的程序必須等到鎖定解除後才能使用這些資料或資源。

  如果一個 I/O 作業耗去過長的時間，這些資源被鎖住的時段比正常情況要久，就會更嚴重的耽擱到系統中其他的程序。此外，這也使得系統形成死結情況的機率大為升高。當 I/O 要花去較長的時間才能完成，則資源鎖定的時間就越長，發生問題的可能性就越高。結果就是，個別的延遲可以多重累積成「雪球效應」（snowball effect），造成系統癱瘓。

  再者，查詢程序將特別的緩慢。舉例來說，如果您的系統正在對一個很長的資料表進行掃瞄的工作，通常必須讀取數十萬甚至數百萬資料列才能完成這項任務。當 I/O 作業要求達到百萬時，在效能上即使是一個輕微的變化也會造成嚴重的後果。一百萬個 10ms 的作業大概要 2.8 個小時才能完成。如果您的 I/O 子系統已經超載，且每個 I/O 作業要花去 40ms，則完成這個查詢的時間將增加至11個小時以上。

  如您所見，不足的空間或不良的 I/O 子系統規劃可能會使 SQL Server 的效能嚴重的下降。在個別元件的容量範圍內設計您的 I/O 子系統，才能讓您的系統效能最佳化。

  規劃SQL Server磁碟架構

  本章之前曾經提到，您應適切規劃您的 I/O 系統，以避免系統出現超載的情況。I/O 子系統一旦超載，I/O 延遲將會劇增，SQL Server 的效能也會劇降。在本節裡，您將可學習到如何建構一個可在子系統極限內順利運作的 SQL Server 系統。課程的第一個部分會告訴您如何決定系統的 I/O 需求量。接著您將規劃您的系統，並在最後有能力建立您的系統。

  決定I/O需求量

  對於一個尚處於概念階段的系統，決定其 I/O 需求量確實相當困難。不過，如果手邊的資料少到讓您覺得這是個不可能的任務，建議您還是儘量蒐集到足夠的資訊，至少可以有個較專業的預測。無論如何，要特別注意到，建立一個無法擴充的系統絕不是什麼好主意。始終預留一些容量與效能以備不時之需，因為您可能很快就會需要它們。

  原則上，您應根據所需的儲存空間與效能等級為基礎，設計一個至少符合最低需求量的系統。在下一節裡，您將會看到如何根據這些因素去決定您的磁碟數量。

  空間

  要判斷您的資料庫到底需要多少空間，並不是一件很複雜的事。空間量等於下列需求的總合：

- 資料所需空間
- 索引所需空間
- 暫存資料所需空間
- 交易記錄所需空間

  所謂資料所需空間，需包含足以容納資料庫新增資料的空間。您的商務與客戶可能會使您的資料庫成長為一個龐然巨物。要測定您的系統成長率，可以定期檢查現存的資料庫，並計算一下不同時期資料庫使用空間量的大小。成長率的計算應至少跨越好幾個月才可看出它的趨勢線。得出的結果可能讓您大吃一驚。

  要對一個沒有過去的系統預估成長量，您除了取得產品訂單的數量之外，尚需乘上估計的資料列大小。持續此一計算達數個時期（可能是幾個月或幾年），您可得出資料檔案成長率的一個大概。不過，您無法由此得知索引的成長量。每資料列索引空間的需求要依據索引的結構及資料量來計算。一個複雜的索引比起簡單的索引要花費更多的資料每列空間。接下來您可決定您的系統該掌握的是兩年，五年或更久的成長。如此應可讓您判斷出I/O子系統的空間需求。

  一旦您測定資料庫的資料量、索引大小、資料庫暫存空間的需求量以及成長率等等數據，您便可計算出所需的磁碟空間。隨後您必須將RAID容錯使用的部分考慮進去。記住，RAID 1 或 RAID 10（資料鏡像備份）會佔用實體磁碟一半的空間。RAID 5 則佔用了陣列裡一部磁碟的空間。此外，要記得廠商提供的數據是指尚未格式化的磁碟空間。一個 9.1GB 的硬碟在格式化後實際上只有 8.6GB。

  當您計算出目前需求的空間量以及成長需求的空間量，便應將步驟移向下個焦點：效能。要規劃出理想的 I/O 子系統，空間與效能的需求均不可偏廢。

  效能

  光是單純把系統規劃得符合空間需求，仍是不夠的。如您在本章所看到的，I/O 子系統的規劃方式可以是效能降低的元兇，也可以是效能提昇的推手。然而，決定 I/O 子系統的效能需求卻不像決定空間需求那麼簡單。

  決定效能需求最好的方法是觀察一個類似的應用或系統。所得的資訊可以給您一個用以推測未來需求的起點。在 第六章 裡您可以學習到與此相關的更多知識。如果您很幸運的找到類似的系統，之後便可利用從這個系統蒐集來的資料以及本章稍早提供的資訊，判斷出所需的磁碟數量。記得要考慮到 I/O 子系統打算使用哪種 RAID 層級。下個步驟便是開始規劃 SQL Server 磁碟架構，然後執行您的方案。

  規劃磁碟架構

  規劃磁碟架構意味著決定資料即將存放的位置，以及建立用來產生資料庫的 SQL 命令檔。比起透過 SQL Server Enterprise Manager 來產生資料庫，使用 SQL 命令檔的好處在於命令檔不僅可以重複使用，必要時您也可以修改它。

  命令檔必須考慮到您的系統擁有多少邏輯磁碟區，磁碟區中又有多少實體磁碟。平衡您的資料庫是相當重要的，因此，每個磁碟掌握的每秒 I/O 作業數量應約略一致。一個不平衡的系統，效能將被系統中最慢的磁碟區給拖累。藉著一些可讓系統最佳化的手段，您應確定交易記錄與資料檔案已分散到系統中所有的磁碟。

  記錄的規劃

  規劃交易記錄存放位置的過程相當簡單。只用一個資料檔案來放置交易記錄是最常見的做法。如果您必須增加記錄檔案到資料庫中，要確定它們被放在 RAID 1 或 RAID 10 的磁碟區中。也需注意此交易記錄與資料或其他交易記錄是否分開獨立出來。

  資料檔案的規劃

  要規劃資料檔案的 I/O 子系統，最好的方法是將每個磁碟區的大小規劃成如同磁碟的大小一般。一般說來，您不需要將 I/O 子系統分割到多重的磁碟區。事實上，如果僅使用一個橫跨整體控制卡的邏輯磁碟區，將會讓您感到相當滿意。不過，您不應利用 Windows 2000 分割技術來橫跨多個控制卡，因為它會增加不必要的資源浪費。

  提示

  秘訣　針對您的資料檔案，應盡可能讓每個控制卡能串接多少磁碟就串接多少磁碟。如此可讓控制卡將資料分散到多個磁碟中。不要使用 Windows 2000 分割技術來橫跨多個控制卡。這會造成 CPU 過重的負擔。

  如果您使用多個控制卡，在分割上可讓每個控制卡的磁碟數量相同，如此便使您的規劃變得更為單純。如果您無法讓每個控制卡串接相同數量的磁碟，至少應以一定比例的方式來適切的存放資料庫。

  舉例來說，如果您使用兩個磁碟區，一個有 20 部磁碟而另一個為 10 部磁碟，您應建立一個由兩個資料檔案組成的檔案群組。（在 第9章 您將可學習到更多使用檔案與檔案群組的知識。）第一個資料檔案應為第二個資料檔案的兩倍大，第一個資料檔案放入20個磁碟的磁碟區，第二個資料檔案放入10個磁碟的磁碟區。當資料載入檔案時，SQL Server 載入第一個資料檔案的資料，將會兩倍於載入第二個資料檔案的資料。如此便可保持每部磁碟的 I/O 載量接近一致。

  規劃的執行

  當您已發展出您用來產生資料庫的 SQL 命令檔，接下來就是好整以暇的等待執行結果。如果您有了錯誤，並未如預期一般建立您需要的資料庫，則應立刻修正問題所在，而不是在資料已開始載入且使用者也已開始存取系統時才來想辦法。SQL 命令檔的用處在於您可在必要時修改命令檔，也可一再重複執行命令檔。底下是一個命令檔的範例，此命令檔利用內有多個檔案的檔案群組，來將資料庫延展於數個控制卡：

      --
      -- SQL script to create a database over several files
      -- d:, e:, and f: for data. e: and f: have twice the number
      -- of disk drives as d:, so they get allocated twice the
      -- database size as d:. l: is used for the log.
      --

      CREATE DATABASE demo

      ON

      PRIMARY ( NAME = demo1,
         FILENAME = `d:\data\demo_dat1.mdf',
         SIZE = 100MB,
         MAXSIZE = 200,
         FILEGROWTH = 20),
      ( NAME = demo2,
         FILENAME = `e:\data\demo_dat2.ndf',
         SIZE = 200MB,
         MAXSIZE = 200,
         FILEGROWTH = 20),
      ( NAME = demo3,
         FILENAME = `f:\data\demo_dat3.ndf',
         SIZE = 200MB,
         MAXSIZE = 200,
         FILEGROWTH = 20)
      LOG ON
      ( NAME = demolog1,
         FILENAME = `l:\data\demo_log1.ldf',
         SIZE = 100MB,
         MAXSIZE = 200,
         FILEGROWTH = 20)
      GO

  本章內的資訊，尤其是本節，應有助於您針對您的 SQL Server 系統，建立一個理想的 I/O 子系統。在下一節裡，會提供一些技巧與建議，幫助您建立與修正 I/O 子系統。

  I/O子系統的技巧與建議

  本節所提供的技巧與建議，可讓您將系統中的 RAID 控制卡最佳化。有些訣竅我們之前已經提過，有些則是新的。理想上，這些技巧與建議應有助於您規劃您的 RAID 陣列，並能將其最佳化。遵循下列方針並謹慎監測您的系統，應可避開一些效能問題：

- 將 SQL Server 交易記錄獨立置存於各自的 RAID 1 或 RAID 10 磁碟區上。交易記錄的 I/O 作業幾乎百分之百為循序的寫入作業。交易記錄唯一需要隨機 I/O 的時候，是在執行復原作業的期間。如果需要復原的資料在快取裡找不到，則必須從交易記錄裡讀取相關的資訊。
- 要有規劃足夠的磁碟，以保持資料檔案磁碟區裡每個磁碟的每秒 I/O 作業量少於85。若系統還未達成這個作業標準，您只要單純的增加陣列裡的磁碟數量即可解決問題。如果 I/O 作業是隨機的（事實上它們經常是），則這些隨機性 I/O 作業可以分散給陣列裡的所有磁碟。
- 如果寫入作業少於 I/O 作業總數的 10%，則資料檔案磁碟區應使用 RAID 5；如果寫入作業大於 10%，則應使用 RAID 10。
- 定期監測每磁碟每秒 I/O 作業數。如果磁碟操作已接近它們的極限，儘快增加新的磁碟。
- 將控制卡分散於系統中可用的 PCI 插槽。除非有必要，否則不可讓兩個控制卡共用一個 PCI 匯流排。
- 只在 CPU 時間充足的系統裡使用 Windows 2000 RAID。軟體 RAID 會產生一個相當的消耗量，足以拖累一個 CPU 週期較短的系統。

  本章總結

  如您在本章所看到的，I/O 子系統是您的資料庫系統中相當重要的元件。您已學到一個磁碟機是如何運作以及它有如何的極限。藉著了解磁碟的能力，您可以規劃您的系統在此能力範圍內順利運作。了解各種 RAID 層級的特性，您便可考量這些特性的優缺點來規劃您的系統。當您設計系統時，您必須謹慎的裁量與調校 I/O 子系統。I/O 的調校均與容量有關。讓系統在不同元件的容量範圍內工作，您可達到最理想的系統效能。