1 數(shù)據(jù)庫設計
要在良好的SQL Server方案中實現(xiàn)最優(yōu)的性能,最關鍵的是要有1個很好的數(shù)據(jù)庫設計方案。在實際工作中,許多SQL Server方案往往是由于數(shù)據(jù)庫設計得不好導致性能很差。所以,要實現(xiàn)良好的數(shù)據(jù)庫設計就必須考慮這些問題。
1.1 邏輯庫規(guī)范化問題
一般來說,邏輯數(shù)據(jù)庫設計會滿足規(guī)范化的前3級標準:
1.第1規(guī)范:沒有重復的組或多值的列。
2.第2規(guī)范:每個非關鍵字段必須依賴于主關鍵字,不能依賴于1個組合式主關鍵字的某些組成部分。
3.第3規(guī)范:1個非關鍵字段不能依賴于另1個非關鍵字段。
遵守這些規(guī)則的設計會產生較少的列和更多的表,因而也就減少了數(shù)據(jù)冗余,也減少了用于存儲數(shù)據(jù)的頁。但表關系也許需要通過復雜的合并來處理,這樣會降低系統(tǒng)的性能。某種程度上的非規(guī)范化可以改善系統(tǒng)的性能,非規(guī)范化過程可以根據(jù)性能方面不同的考慮用多種不同的方法進行,但以下方法經實踐驗證往往能提高性能。
1.如果規(guī)范化設計產生了許多4路或更多路合并關系,就可以考慮在數(shù)據(jù)庫實體(表)中加入重復屬性(列)。
2.常用的計算字段(如總計、最大值等)可以考慮存儲到數(shù)據(jù)庫實體中。
比如某一個項目的計劃管理系統(tǒng)中有計劃表,其字段為:項目編號、年初計劃、二次計劃、調整計劃、補列計劃…,而計劃總數(shù)(年初計劃+二次計劃+調整計劃+補列計劃)是用戶經常需要在查詢和報表中用到的,在表的記錄量很大時,有必要把計劃總數(shù)作為1個獨立的字段加入到表中。這里可以采用觸發(fā)器以在客戶端保持數(shù)據(jù)的一致性。
3.重新定義實體以減少外部屬性數(shù)據(jù)或行數(shù)據(jù)的開支。相應的非規(guī)范化類型是:
(1)把1個實體(表)分割成2個表(把所有的屬性分成2組)。這樣就把頻繁被訪問的數(shù)據(jù)同較少被訪問的數(shù)據(jù)分開了。這種方法要求在每個表中復制首要關鍵字。這樣產生的設計有利于并行處理,并將產生列數(shù)較少的表。
(2)把1個實體(表)分割成2個表(把所有的行分成2組)。這種方法適用于那些將包含大量數(shù)據(jù)的實體(表)。在應用中常要保留歷史記錄,但是歷史記錄很少用到。因此可以把頻繁被訪問的數(shù)據(jù)同較少被訪問的歷史數(shù)據(jù)分開。而且如果數(shù)據(jù)行是作為子集被邏輯工作組(部門、銷售分區(qū)、地理區(qū)域等)訪問的,那么這種方法也是很有好處的。
1.2 生成物理數(shù)據(jù)庫
要想正確選擇基本物理實現(xiàn)策略,必須懂得數(shù)據(jù)庫訪問格式和硬件資源的操作特點,主要是內存和磁盤子系統(tǒng)I/O。這是一個范圍廣泛的話題,但以下的準則可能會有所幫助。
1.與每個表列相關的數(shù)據(jù)類型應該反映數(shù)據(jù)所需的最小存儲空間,特別是對于被索引的列更是如此。比如能使用smallint類型就不要用integer類型,這樣索引字段可以被更快地讀取,而且可以在1個數(shù)據(jù)頁上放置更多的數(shù)據(jù)行,因而也就減少了I/O操作。
2.把1個表放在某個物理設備上,再通過SQL Server段把它的不分簇索引放在1個不同的物理設備上,這樣能提高性能。尤其是系統(tǒng)采用了多個智能型磁盤控制器和數(shù)據(jù)分離技術的情況下,這樣做的好處更加明顯。
3.用SQL Server段把一個頻繁使用的大表分割開,并放在2個單獨的智能型磁盤控制器的數(shù)據(jù)庫設備上,這樣也可以提高性能。因為有多個磁頭在查找,所以數(shù)據(jù)分離也能提高性能。
4.用SQL Server段把文本或圖像列的數(shù)據(jù)存放在1個單獨的物理設備上可以提高性能。1個專用的智能型的控制器能進一步提高性能。
2 與SQL Server相關的硬件系統(tǒng)
與SQL Server有關的硬件設計包括系統(tǒng)處理器、內存、磁盤子系統(tǒng)和網絡,這4個部分基本上構成了硬件平臺,Windows NT和SQL Server運行于其上。
2.1 系統(tǒng)處理器(CPU)
根據(jù)自己的具體需要確定CPU結構的過程就是估計在硬件平臺上占用CPU的工作量的過程。從以往的經驗看,CPU配置最少應是1個80586/100處理器。如果只有2~3個用戶,這就足夠了,但如果打算支持更多的用戶和關鍵應用,推薦采用Pentium Pro或PⅡ級CPU。
2.2 內存(RAM)
為SQL Server方案確定合適的內存設置對于實現(xiàn)良好的性能是至關重要的。SQL Server用內存做過程緩存、數(shù)據(jù)和索引項緩存、靜態(tài)服務器開支和設置開支。SQL Server最多能利用2GB虛擬內存,這也是最大的設置值。還有一點必須考慮的是Windows NT和它的所有相關的服務也要占用內存。
Windows NT為每個WIN32應用程序提供了4GB的虛擬地址空間。這個虛擬地址空間由Windows NT虛擬內存管理器(VMM)映射到物理內存上,在某些硬件平臺上可以達到4GB。SQL Server應用程序只知道虛擬地址,所以不能直接訪問物理內存,這個訪問是由VMM控制的。Windows NT允許產生超出可用的物理內存的虛擬地址空間,這樣當給SQL Server分配的虛擬內存多于可用的物理內存時,會降低SQL Server的性能。
這些地址空間是專門為SQL Server系統(tǒng)設置的,所以如果在同一硬件平臺上還有其它軟件(如文件和打印共享,應用程序服務等)在運行,那么應該考慮到它們也占用一部分內存。一般來說硬件平臺至少要配置32MB的內存,其中,Windows NT至少要占用16MB。1個簡單的法則是,給每一個并發(fā)的用戶增加100KB的內存。例如,如果有100個并發(fā)的用戶,則至少需要32MB+100用戶*100KB=42MB內存,實際的使用數(shù)量還需要根據(jù)運行的實際情況調整??梢哉f,提高內存是提高系統(tǒng)性能的最經濟的途徑。
2.3 磁盤子系統(tǒng)
設計1個好的磁盤I/O系統(tǒng)是實現(xiàn)良好的SQL Server方案的一個很重要的方面。這里討論的磁盤子系統(tǒng)至少有1個磁盤控制設備和1個或多個硬盤單元,還有對磁盤設置和文件系統(tǒng)的考慮。智能型SCSI-2磁盤控制器或磁盤組控制器是不錯的選擇,其特點如下:
(1)控制器高速緩存。
(2)總線主板上有處理器,可以減少對系統(tǒng)CPU的中斷。
(3)異步讀寫支持。
(4)32位RAID支持。
(5)快速SCSI—2驅動。
(6)超前讀高速緩存(至少1個磁道)。
3 檢索策略
在精心選擇了硬件平臺,又實現(xiàn)了1個良好的數(shù)據(jù)庫方案,并且具備了用戶需求和應用方面的知識后,現(xiàn)在應該設計查詢和索引了。有2個方面對于在SQL Server上取得良好的查詢和索引性能是十分重要的,第1是根據(jù)SQL Server優(yōu)化器方面的知識生成查詢和索引;第2是利用SQL Server的性能特點,加強數(shù)據(jù)訪問操作。
3.1 SQL Server優(yōu)化器
Microsoft SQL Server數(shù)據(jù)庫內核用1個基于費用的查詢優(yōu)化器自動優(yōu)化向SQL提交的數(shù)據(jù)查詢操作。數(shù)據(jù)操作查詢是指支持SQL關鍵字WHERE或HAVING的查詢,如SELECT、DELETE和UPDATE。基于費用的查詢優(yōu)化器根據(jù)統(tǒng)計信息產生子句的費用估算。
了解優(yōu)化器數(shù)據(jù)處理過程的簡單方法是檢測SHOWPLAN命令的輸出結果。如果用基于字符的工具(例如isql),可以通過鍵入SHOW SHOWPLAN ON來得到SHOWPLAN命令的輸出。如果使用圖形化查詢,比如SQL Enterprise Manager中的查詢工具或isql/w,可以設定配置選項來提供這一信息。
SQL Server的優(yōu)化通過3個階段完成:查詢分析、索引選擇、合并選擇。
1.查詢分析
在查詢分析階段,SQL Server優(yōu)化器查看每一個由正規(guī)查詢樹代表的子句,并判斷它是否能被優(yōu)化。SQL Server一般會盡量優(yōu)化那些限制掃描的子句。例如,搜索和/或合并子句。但是不是所有合法的SQL語法都可以分成可優(yōu)化的子句,如含有SQL不等關系符"<>"的子句。因為"<>"是1個排斥性的操作符,而不是1個包括性的操作符,所在掃描整個表之前無法確定子句的選擇范圍會有多大。當1個關系型查詢中含有不可優(yōu)化的子句時,執(zhí)行計劃用表掃描來訪問查詢的這個部分,對于查詢樹中可優(yōu)化的SQL Server子句,則由優(yōu)化器執(zhí)行索引選擇。
2.索引選擇
對于每個可優(yōu)化的子句,優(yōu)化器都查看數(shù)據(jù)庫系統(tǒng)表,以確定是否有相關的索引能用于訪問數(shù)據(jù)。只有當索引中的列的1個前綴與查詢子句中的列完全匹配時,這個索引才被認為是有用的。因為索引是根據(jù)列的順序構造的,所以要求匹配是精確的匹配。對于分簇索引,原來的數(shù)據(jù)也是根據(jù)索引列順序排序的。想用索引的次要列訪問數(shù)據(jù),就像想在電話本中查找所有姓為某個姓氏的條目一樣,排序基本上沒有什么用,因為你還是得查看每一行以確定它是否符合條件。如果1個子句有可用的索引,那么優(yōu)化器就會為它確定選擇性。
所以在設計過程中,要根據(jù)查詢設計準則仔細檢查所有的查詢,以查詢的優(yōu)化特點為基礎設計索引。
(1)比較窄的索引具有比較高的效率。對于比較窄的索引來說,每頁上能存放較多的索引行,而且索引的級別也較少。所以,緩存中能放置更多的索引頁,這樣也減少了I/O操作。
(2)SQL Server優(yōu)化器能分析大量的索引和合并可能性。所以與較少的寬索引相比,較多的窄索引能向優(yōu)化器提供更多的選擇。但是不要保留不必要的索引,因為它們將增加存儲和維護的開支。對于復合索引、組合索引或多列索引,SQL Server優(yōu)化器只保留最重要的列的分布統(tǒng)計信息,這樣,索引的第1列應該有很大的選擇性。
(3)表上的索引過多會影響UPDATE、INSERT和DELETE的性能,因為所有的索引都必須做相應的調整。另外,所有的分頁操作都被記錄在日志中,這也會增加I/O操作。
(4)對1個經常被更新的列建立索引,會嚴重影響性能。
(
關鍵詞標簽:優(yōu)化,性能,數(shù)據(jù)庫,索引
相關閱讀
熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構的關系
人氣排行 配置和注冊ODBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠程導入(導出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法