數據庫系統和操作系統一樣,在計算機上安裝成功后,還需要進一步配置和優化,從而使其具有更強大的功能并運行在最佳狀態。如果在設計階段因為各種因素沒有進行較為合理的配置和計劃,那么就應在后期對數據庫系統進行優化。
在Nficrosoft SQL Server 2000中提供了一些優化實用工具,使用這些工具可以有效地提高數據庫的使用效率。在一般人的眼里,“優化”可能算得上是一種高級技能,但真正做起來也不是很難,您也可以成為這方面的高手。本文從十二個方面來談如何優化SQL Server2000,使其獲得較高性能。優化數據庫可在生產數據庫上執行,獲得最佳性能收益的三個操作包括:①備份和還原操作;②將數據大容量復制到表中;③執行數據庫控制臺命令(DBCC)操作。
一般情況下,不需要優化這些操作。然而,在性能很關鍵的情形中,可采用以下一些技巧來優化性能。
1.優化備份和還原性能
SQL Server 2000提供幾種方法以提高備份及還原操作的速度。
(1)使用多個備份設備使得可以將備份并行寫入所有設備。同樣,可以將備份并行從多個設備還原。備份設備的速度是備份吞吐量的一個潛在瓶頸,使用多個設備可以按使用的設備數成比例提高吞吐量。
(2)使用數據庫備份、差異數據庫備份和事務日志備份的組合,可以將故障恢復所需的時間減到最少。差異數據庫備份可以減少必須應用于恢復數據庫操作的事務日志量。這種方法通常比創建完整數據庫備份快。
(3)使用日志記錄和最小日志記錄大容量的復制操作。
2.優化數據庫、差異數據庫和文件備份性能
創建數據庫備份包含兩個步驟:①將數據從數據庫文件復制到備份設備。②將事務日志中用于將數據庫前滾到一致狀態的那部分復制到相同的備份設備。
與創建數據庫備份一樣,創建差異數據庫備份也包括上面兩步,但只復制已更改的數據(盡管需要讀取所有數據庫頁以確定數據是否更改)。備份數據庫文件只需一步,將數據從數據庫文件復制到備份設備。
用于存儲數據庫的數據庫文件按磁盤設備排序,并給每個設備指派讀取器線程,給每個備份設備指派寫入器線程。該讀取器線程從數據庫文件中讀取數據,寫入器線程將數據寫入備份設備。通過在更多的邏輯驅動器中分布數據庫文件可以增加并行讀取操作。同樣,通過使用更多的備份設備可以增加并行寫操作。
一般情況下,瓶頸是數據庫文件或備份設備。如果讀取吞吐總量比備份設備吞吐總量大,則瓶頸在備份設備這一側。添加更多的備份設備(如果必要還需添加SCSI控制器)可以提高性能。然而,如果備份吞吐總量比讀取吞吐總量大,則應在設備上添加更多的數據庫文件或者在RAID(獨立磁盤冗余陣列)設備內使用更多磁盤,以便增加讀取吞吐量。
3.優化事務日志備份性能
創建事務日志備份只包含單個步驟,將日志中尚未備份的部分復制到備份設備。雖然可能有多個事務日志文件,但事務日志在邏輯上是某個線程按順序讀取的一個流。
給每個備份設備指派讀取器/寫入器線程。通過添加更多的備份設備可以獲得更高的性能。
瓶頸可能是包含事務日志文件的磁盤設備或者是備份設備,具體取決于它們的相對速度和使用的備份設備數。添加更多備份設備將提高線性比例,直到達到包含事務日志文件的磁盤設備最大容量,此后如果不通過使用磁盤條帶化等方法提高包含事務日志的磁盤設備的速度,將不可能獲得更多性能收益。
4.優化還原性能
還原數據庫備份或差異數據庫備份包含四個步驟:
1)創建數據庫和事務日志文件,如果二者還不存在。
2)將數據從備份設備復制到數據庫文件。
3)從事務日志文件復制事務日志。
4)前滾事務日志,然后(如果需要)重新啟動恢復。
應用事務日志備份包含兩個步驟:
1)將數據從備份設備復制到事務日志文件。
2)前滾事務日志。
還原數據庫文件包含兩個步驟:
1)創建任何丟失的數據庫文件。
2)將數據從備份設備復制到數據庫文件。
如果數據庫和事務日志文件還不存在,必須先創建它們才能將數據還原到其中。創建數據庫和事務日志文件并將文件內容初始化為零。使用單獨的工作線程并行創建和初始化文件。按磁盤設備排序數據庫和事務日志文件,并給每個磁盤設備指派單獨的工作線程。創建和初始化文件需要很大的吞吐量,因此在可用的邏輯驅動器中均勻分布文件能產生最佳性能。
通過讀取器/寫入器線程將數據和事務日志從備份設備復制到數據庫和事務日志文件,給每個備份設備指派一個線程。復制性能受備份設備傳送數據的能力或數據庫和事務日志文件接收數據的能力的限制。因此,復制性能隨添加的備份設備數線性地提高,直到達到數據庫或事務日志文件接收數據能力的極限。
前滾事務日志操作的性能已經固定,除使用更快的計算機外不能進一步優化。
5.優化磁帶備份設備性能
有四個變量影響磁帶備份設備的性能,并使SQL Server備份及還原性能操作得以在大體上隨添加更多磁帶設備而提高線性比例。①軟件數據塊大小。②共享小型計算機系統接口(SCSI)總線的磁帶設備數。③磁帶設備類型。
軟件數據塊大小是由SQL Server為最佳性能計算的,不應更改。
許多高速磁帶驅動器如果對每個所使用的磁帶驅動器有專用SCSI總線,將運行得更好。本機傳輸速率超過SCSI總線速度的50%的驅動器必須在專用SCSI總線上。
注意,永遠不要將磁帶驅動器與磁盤或CD-ROM驅動器放置在同一個SCSI總線上。對這些設備的錯誤處理操作互不兼容。
6.優化磁盤備份設備性能
磁盤備份設備的原始I/O速度影響磁盤備份設備性能,并使SQL Server備份及還原性能操作得以在大體上隨添加多個磁盤設備而線性提高。
在對磁盤備份設備使用RAID(獨立磁盤冗余陣列)時需認真考慮。例如,RAID5的寫入性能低,大致與單個磁盤的速度相同(由于必須維護奇偶信息)。另外,將數據追加到文件的原始速度明顯比原始設備寫入速度慢。
如果將備份設備高度條帶化,以使對備份設備的最大寫入速度遠遠超過備份設備將數據追加到文件的速度,則在相同的條帶集上放置幾個邏輯備份設備會比較合適。換句話說,可以通過在相同的邏輯驅動器上放置幾個備份媒體家族來提高備份性能。然而,需要采用經驗方法確定這對每個環境是收益還是損失。通常情況下,最好將每個備份設備放置在單獨的磁盤設備上。
一般在SCSI總線上只有少數幾個磁盤可以以最大速度運行,但Ultra-wide和Ultra-2總線可以處理更多磁盤。不過,很可能需要認真配置硬件以獲得最佳性能。
7.數據壓縮
如今的磁帶驅動器有內置的硬件數據壓縮,可顯著提高將數據傳送到驅動器的有效傳送速率。數據壓縮可以提高將數據傳送到磁帶驅動器的有效傳送速率,該速率超過通過禁用硬件壓縮所達到的速率。數據庫內實數據的可壓縮性取決于數據本身和所使用的磁帶驅動器。對于大范圍的數據庫,典型的數據壓縮率是從1.2∶1到2∶1。該壓縮率對于在多種業務應用程序中使用的數據是典型的,但有些數據庫可能有更高或更低的壓縮率。例如,主要包含已壓縮圖像的數據庫將不能再由磁帶驅動器進一步壓縮。有關數據壓縮的更多信息,請參見磁帶驅動器的供應商文檔。
默認情況下SQL Server支持硬件壓縮,但可以使用3205跟蹤標記禁用硬件壓縮。在極少數情況下,禁用硬件壓縮可以提高備份性能。例如,如果數據已經完全壓縮,禁用硬件壓縮可防止磁帶驅動器浪費時間試圖進一步壓縮數據。
8.傳送到磁帶的數據量
創建數據庫備份只捕獲數據庫中包含實際數據的部分,而不備份未使用的空間,其結果將使備份操作的速度更快。
雖然可以根據需要將SQL Server 2000數據庫配置為自動增長,但可繼續保留數據庫內的空間以保證該空間可用。保留數據庫內的空間對備份吞吐量和備份數據庫所需的總時間沒有負面影響。
9.優化DBCC性能
數據庫控制臺命令(DBCC)往往大量占用CPU及磁盤,因為DBCC必須讀取每個數據頁,而這需要從磁盤到內存全都檢查一遍(除非數據頁已高速緩存到內存中)。當系統上有許多活動(如大量的查詢處理)而運行DBCC時,可用內存減少,而且SQL Server 2000被迫將數據頁發送到tempdb數據庫中進行假脫機處理,DBCC的性能由此削弱。因此,如果使更多內存可用于DBCC處理,將可以高速緩存數據庫中的更多內容,從而使DBCC語句執行得更快。
tempdb數據庫駐留在磁盤上,因此在將數據寫入或寫出磁盤時,來自I/O操作的瓶頸將削弱性能。對大型數據庫(相對于可用內存的大小而言),運行DBCC會導致送到tempdb數據庫進行假脫機處理,與系統活動無關。因此,建議將tempdb數據庫放置在與用戶數據庫分開的一個或多個快速磁盤上,如RAID(獨立磁盤冗余陣列)。
說明:執行DBCC CHECKDB時將對數據庫內的每個表白動執行DBCC CHECKTABLE和DBCC CHECKALLOC,因而不必單獨運行這兩個語句。
10.優化大容量復制性能
為盡可能快地大容量復制數據,可使用下列選項指定如何使用bcp實用工具或BULK INSERT語句將數據大容量復制到SQL Server 2000內:
(1)使用有日志記錄和無日志記錄的大容量復制。
(2)對并行數據裝載使用bcp實用工具。
(3)控制鎖定行為。
(4)使用批處理。
(5)排序數據文件。
說明:如果可能,使用BULK INSERT語句而不是bcp實用工具將數據大容量復制到SQL Server內。BULK INSERT語句比bcp實用工具快。
有兩個因素決定可以或應該使用哪個選項以提高大容量復制操作性能:
(1)表內現有的數據量相對于要復制到表內的數據量。
(2)表上索引的數目和類型。
另外,這些因素還取決于是從單個客戶端還是并行從多個客戶端將數據大容量復制到表內。
11.將數據從單個客戶端裝載到空表內
當將數據從單個客戶端裝載到空表內時,建議:
(1)指定TABLOCK提示,這使得在大容量復制操作過程中使用表級鎖。
(2)使用ROWS_PER_BATCH提示指定大的批處理大小,使用單個批處理代表整個文件的大小。
(3)指定無日志記錄的大容量復制操作,不應在執行無日志記錄操作之后創建事務日志備份。
另外,如果表有聚集索引并對數據文件內的數據排序以匹配聚集索引鍵列,則將數據大容量復制到已經有聚集索引鍵的表內并指定ORDER提示。這明顯比在將數據復制到表內之后創建聚集索引快。
如果表上還存在非聚集索引,則在將數據復制到表內之前除去這些索引。若將數據大容量復制到沒有非聚集索引的表內,然后重新創建非聚集索引,則一般比將數據大容量復制到已經有非聚集索引的表內快。
12.從多個客戶端并行裝載數據
如果SQL Server運行在有多個處理器的計算機上,并且可以將要大容量復制到表內的數據分區成單獨的數據文件,則建議從多個客戶端將數據并行裝載到同一個表內,從而提高大容量復制操作的性能。例如,將大容量復制從八個客戶端裝載到一個表里,每一個客戶端必須有一個包含分區數據的部分。為獲得最大性能,每個客戶端的批處理大小應與客戶端數據文件相同。
從多個客戶端將數據復制到表內時,應考慮下列因素:
(1)必須先將表上的所有索引除去,然后在表上重新創建索引。考慮通過同時從單獨的客戶端創建每個輔助索引來并行重新創建輔助索引。
(2)在裝載時聚集索引不存在,因此使用已排序的數據和ORDER提示不會影響性能。
(3)數據必須分為多個輸入文件,每個客戶端一個文件。
與從單個客戶端的大容量復制操作一樣,建議:
(1)指定TABLOCK提示。這使得在大容量復制操作過程中使用表級鎖。
(2)使用ROWS_PER_BATCH提示指定大的批處理大小。建議對每個客戶端,使用單個批處理代表整個客戶端文件的大小。 (3)將select into/bulkcopy選項設置為真以啟用無日志記錄的操作。