劉冬 周彬
摘 要:本文從SQL SERVER 數據庫的范式優化、查詢優化、索引優化等方面出發,對數據庫的性能優化方法進行探討,總結了數據庫優化應遵循的方法,力圖提高SQL語句的執行效率。
數據庫技術的應用已由傳統數據處理發展至圖像處理、商業決策管理等更多的新興領域,而這些新興領域對信息系統的高效、安全、穩定的性能要求更高。如何有效組織及處理數據庫中的海量數據, 保證系統吞吐量, 成為數據庫優化的首要任務。本文針對數據庫優化技術探索合適的方法,從范式優化、查詢優化、索引優化等多個方面進行探討,希望可以通過這些優化使信息系統更適用于人們的需求。
1 合理使用范式
關系模式規范化的目的是為了消除存儲異常、減少數據冗余,解決數據插入異常、刪除異常,保證數據完整性(即正確性和一致性)和存儲效率。但是把數據庫分解得越多,就會造成查詢時的時間浪費。通常認為當一個關系模式可以達到3NF(第三范式)或BCNF時,就具有了合理的結構及良好的性能。當關系規范化達到BCNF時, 雖然可以消除數據冗余太異常, 但卻可能會破壞了數據語義。所以,我們在設計時要先盡可能設計為BCNF,如果這時BCNF不到保持函數依賴的要求,破壞了數據語義,就應該則降低為3NF。在這里,3NF是指所有的非主屬性都完全依賴主屬性且不傳遞于主屬性。一般情況下當數據庫符合3NF后,通常就能很好的達到關系模式規范化的目的,它可以從根本上消除了數據冗余和數據不一致的問題。當然,使用了第三范式設計數據庫后,還需要對表或者相關數據的結構及性能進行全面調整和優化。
2 采用視圖方式
在一些數據量較大的表中,可能只有小部分數據會被訪問,而且是被頻繁的訪問。這時,我們就可以采用視圖方式,把這部分數據建立為視圖。有時,又會有一些數據需要針對不同角色有不同權限的開放,那么這些數據也可以做成視圖,并給視圖賦予不同的權限,這就可以從一定程度上保證了數據的安全性。
3 建立存儲過程
SQL Server 中存儲過程是SQL 語句和流程控制語句的集合。工作中,當某些操作需要使用大量重復的計算時,我們就可以合理使用存儲過程儲存這些操作,完成軟件復用,實現高性能的數據操作。同時,我們在使用存儲過程后,還能能過隔離和加密的方法提高數據庫的安全性。
4 使用索引優化數據庫
應用數據庫中會存儲海量的數據表,人們對其做查詢操作時,若進行全表掃描,會占用相當長的時間。索引與字典的目錄類似,是數據庫中重要的數據結構,它可以通過關鍵值指向表中的數據行。通過合理地創建并使用索引,可以避免上述全表掃描,提高數據查詢的效率,可以減少由于連接造成的資源浪費,優化數據庫性能。我們可以在表或視圖的一列或是多列上建索引,也可以在兩列或多列上建立復合索引。但是,索引在數據庫中會占用存儲空間,會犧牲系統性能,會在時間和空間方面帶來負面影響,因為表越大,索引也就越大。當一個含有索引的表中數據行被更新時,索引也同樣需要更新,需要及時反映數據的變化。在含有索引的表中進行插入、更新和刪除的操作時,速度可能會被影響。所以,在創建索引時必須考慮實際數據庫的查詢需求,以實現基于索引的數據庫優化。
在建立索引時,應該找到平衡點,注意以下問題:
(1)如果處理的關系表比較小, 就不需要建立索引。因為直接遍歷整個表用的時間并不多, 建立索引反而加重了系統負擔。
(2)若表里的數據常會頻繁更新, 那么維護索引也將非常頻繁, 如果這些工作量超出了索引帶給我們的查詢優勢, 則還不如不使用索引。
(3)索引分為聚集索引和非聚集索引。聚集索引的物理存儲按照索引排序。非聚集索引的物理存儲不按照索引排序。聚集索引在插入數據的時候,所花費在“物理存儲的排序” 時間上較長,但查詢數據的速度會比查詢非聚集數據的速度快。在建立時應考慮:
(4)不在 where 子句中進行表達式運算操作(如加減乘除)及函數操作。因為上述操作會使查詢放棄使用索引。
(5)創建及使用觸發器和存儲過程時,開始處進行“SET NOCOUNT ON” 的設置,結束時進行“SET NOCOUNT OFF” 設置,以減少服務器向客戶機發送信息造成的空間上和時間上的浪費。
(6)盡量分解大事務為小事務,提高系統的并發能力。
(7)小范圍內進行查詢時,子查詢會比連接查詢效率高。子查詢是指在WHERE或HAVING子句中又包含了一個SELECT語句。
例如,SELECT * FROM 課程表 WHERE 報名人數>(SELECT AVG(報名人數) FROM 課程表)
語句在執行時由內到外逐層執行,小范圍內效率較高。但如果大范圍內使用了嵌套,且查詢嵌套層次越多, 效率越低, 子查詢會比連接查詢效率低。
(8)如果IN能用BETWEEN代替就用BETWEEN。因為BETWEEN會使用索引,但IN不會用索引。
(9)FROM子句中選擇合適的表序
SQL語句FROM子句中的表名有時會是多張表, SQL Server在對表名進行解析時,會按照自右至左的順序處理,也就是寫在最后的表將被最先處理。所以,若FROM子句中包含多表則應該選擇記錄行最少的表要寫在FROM子句的最后。
6 結論
優化數據庫可以明顯提高計算機系統效率,具有非常深遠的意義。在數據庫設計階段對邏輯結構進行合理化優化,可獲得系統的較小開銷,從根本上提高系統的整體性能。