尹 宇
(施耐德電氣(中國)有限公司西安分公司 陜西 710075)
隨著企業(yè)應(yīng)用的復(fù)雜度逐步加大,數(shù)據(jù)量也變的比以前多很多。優(yōu)化SQL SERVER數(shù)據(jù)庫成了,我們在開發(fā)應(yīng)用的時(shí)候,刻不容緩的事情。
(1)優(yōu)化過程
數(shù)據(jù)庫優(yōu)化的步驟包括采集分析數(shù)據(jù),制定優(yōu)化方案,實(shí)施,評估。
(2)采集分析數(shù)據(jù)
根據(jù)不同數(shù)據(jù)庫的情況,準(zhǔn)備一些數(shù)據(jù)庫的腳本,對采集數(shù)據(jù)來說非常重要。例如I/O的優(yōu)化。在sql server的運(yùn)行過程中,與硬盤交互的時(shí)候,如果讀寫不能順利完成,數(shù)據(jù)庫就有可能損壞。一個(gè)通常的規(guī)則就是,把日志文件和數(shù)據(jù)文件放在不同的物理盤中。
Dynamic Management Views可以檢測I/O瓶頸。
數(shù)據(jù)庫由于I/O引起系統(tǒng)系能下降時(shí),可以通過以下SQL看到:
以下語句可以看到是哪個(gè)磁盤引起的瓶頸:
(3)制定方案
對于有風(fēng)險(xiǎn)的方案,一定要先備份數(shù)據(jù)庫。制定方案的時(shí)候,要有開發(fā)人員,數(shù)據(jù)庫專家,系統(tǒng)管理員來參加。
(4)實(shí)施
方案完成以后,要進(jìn)行實(shí)施。實(shí)施一般是在業(yè)務(wù)空閑時(shí)間進(jìn)行的。實(shí)施的過程中,應(yīng)該有檢查點(diǎn)。我們可以對著檢查點(diǎn),一項(xiàng)一項(xiàng)的去執(zhí)行。當(dāng)實(shí)施過程中出現(xiàn)問題的時(shí)候,要及時(shí)的調(diào)整策略,進(jìn)行恢復(fù)。
(5)評估
要從系統(tǒng)和應(yīng)用兩個(gè)層面來評估,優(yōu)化的結(jié)果。系統(tǒng)方面:CPU的使用,I/O的使用,系統(tǒng)內(nèi)存,網(wǎng)絡(luò)狀態(tài)。應(yīng)用方面:sql的響應(yīng)時(shí)間,sql的執(zhí)行計(jì)劃,數(shù)據(jù)庫負(fù)載情況。
系統(tǒng)優(yōu)化是資源配置的優(yōu)化。系統(tǒng)優(yōu)化的重點(diǎn)在于找到系統(tǒng)的瓶頸。由于有的時(shí)候,我們對系統(tǒng)不是特別的了解。優(yōu)化起來就有困難。需要我們利用系統(tǒng)已經(jīng)有的工具。例如:CPU性能調(diào)優(yōu)。用windows任務(wù)管理器可以發(fā)現(xiàn)哪一個(gè)實(shí)例消耗了大量的CPU
圖1 CPU資源消耗
通過以上圖片我們可以看到是哪個(gè)實(shí)例消耗了大量的CPU資源,通過這種方法,我可以很方便的定位出消耗資源的實(shí)例。
數(shù)據(jù)庫消耗大的 sql語句,索引的設(shè)計(jì),鎖的應(yīng)用等都是導(dǎo)致數(shù)據(jù)庫變慢的很重要的因素。
(1)索引的設(shè)計(jì)
在經(jīng)常變動(dòng)的表上,索引不要過多。對于小表,不要建立索引。
數(shù)據(jù)庫數(shù)據(jù)的變化,也會(huì)降低索引的性能,所以需要定期的重建索引。我們還可以用我們平時(shí)積累的腳本來分析索引的性能。
不要用SELECT *這樣的語句,這樣的語句會(huì)使索引失效,應(yīng)用的時(shí)候,只列出需要查詢的列。
(2)限定語句的復(fù)雜度
對于動(dòng)態(tài)SQL,很多時(shí)候會(huì)讓用戶根據(jù)自己的條件進(jìn)行組合查詢,這樣雖然功能強(qiáng)大。但是過多的選擇條件,復(fù)雜的sql,會(huì)造成性能的下降。
最好使用臨時(shí)表來存儲(chǔ)大量數(shù)據(jù)。
對于性能低下的SQL語句,減少語句的logical reads是關(guān)鍵。 logical reads指執(zhí)行時(shí)需訪問的單位為8K的數(shù)據(jù)頁總數(shù)。如果logical reads 越少,則需要內(nèi)存和CPU時(shí)間就越少,語句執(zhí)行速度就快。以下運(yùn)行set statistics io命令可以得到logical reads。
如果Logical reads與返回行數(shù)相差大,就需要優(yōu)化此語句。
通過以上步驟,我們可以對我們的數(shù)據(jù)庫進(jìn)行優(yōu)化。但是,優(yōu)化一般不是一次就能夠完成的。我們需要根據(jù)實(shí)際情況。進(jìn)行多次優(yōu)化,調(diào)整我們的計(jì)劃,達(dá)到我們的優(yōu)化目的。
[1] 白鱔,著.Oracle優(yōu)化日記.人民郵電出版社.2012
[2] Mike Hotek,著.傳思,譯.SQL SERVER2008實(shí)現(xiàn)與維護(hù).清華大學(xué)出版社.2011
[3] 徐海蔚,著.Microsoft SQL Server企業(yè)級平臺(tái)管理實(shí)踐.電子工業(yè)出版社,2010.
[4] www.mssqltips.com