從外到內提高SQL Server資料庫效能

2021-09-06 06:05:24 字數 3086 閱讀 3391

如何提高sql server資料庫的效能,該從**入手呢?筆者認為,該遵循從外到內的順序,來改善資料庫的執行效能。如下圖:

第一層:網路環境

到企業碰到資料庫反映速度比較慢時,首先想到的是是否是網路環境所造成的。而不是一開始就想著如何去提高資料庫的效能。這是很多資料庫管理員的乙個誤區。因為當網路環境比較惡劣時,你就算再怎麼去改善資料庫效能,也是枉然。

如以前有個客戶,向筆者反映資料庫響應時間比較長,讓筆者給他們乙個提高資料庫效能的解決方案。那時,筆者感到很奇怪。因為據筆者所知,這家客戶資料庫的記錄量並不是很大。而且,他們配置的資料庫伺服器硬體很不錯。筆者為此還特意跑到他們企業去檢視問題的原因。一看原來是網路環境所造成的。這家企業的客戶機有200多台,而且都是利用集線器進行連線。這就導致企業內部網路廣播氾濫,網路擁塞。而且由於沒有部署企業級的防毒軟體,網路內部客戶機存在病毒,掠奪了一定的頻寬。不僅資料庫系統響應速度比較慢,而且其他應用軟體,如郵箱系統,速度也不理想。

在這種情況下,即使再花十倍、百倍力氣去提公升sql server資料庫的效能,也是竹籃子打水一場空。因為現在資料庫伺服器的效能瓶頸根本不在於資料庫本身,而在於企業的網路環境。若網路環境沒有得到有效改善,則sql server資料庫效能是提高不上去的。

為此,筆者建議這家企業,想跟他們的網路管理員談談,看看如何改善企業的網路環境,減少廣播包和網路衝突;並且有效清除區域網內的病毒、木馬等等。三個月後,我再去回訪這家客戶的時候,他們反映資料庫效能有了很大的提高。而且其他應用軟體,效能也有所改善。

所以,當企業遇到資料庫效能突然降低的時候,第乙個反應就是檢視網路環境,看看其實否有惡化。只有如此,才可以少走冤枉路。

第二層:伺服器配置

這裡指的伺服器配置,主要是講資料庫伺服器的硬體配置以及周邊配套。雖然說,提高資料庫的硬體配置,需要企業付出一定的代價。但是,這往往是乙個比較簡便的方法。比起優化sql語句來說,其要簡單的多。

如企業可以通過增加硬碟的數量來改善資料庫的效能。在實際工作中,硬碟輸入輸出瓶頸經常被資料庫管理員所忽視。其實,到併發訪問比較多的時候,硬碟輸入輸出往往是資料庫效能的乙個主要瓶頸之一。此時,若資料庫管理員可以增加幾個硬碟,通過磁碟陣列來分散磁碟的壓力,無疑是提高資料庫效能的乙個捷徑。

如增加伺服器的記憶體或者cpu。當資料庫管理員發現資料庫效能的不理想是由記憶體或者cpu所造成的,此時,任何的改善資料庫伺服器本身的措施都將一物用處。所以,有些資料庫管理專家,把改善伺服器配置當作資料庫效能調整的乙個先決條件。

如解決部署在同乙個資料庫伺服器上的資源爭用問題。雖然我們多次強調,要為資料庫專門部署乙個伺服器。但是,不少企業為了降低資訊化的成本,往往把資料庫伺服器跟應用伺服器放在同乙個伺服器中。這就會導致不同伺服器之間的資源爭用問題。如把檔案伺服器跟資料伺服器部署在同乙個伺服器中,當對檔案伺服器進行備份時,資料庫效能就會有明顯的下降。所以,在資料庫效能發現週期性的變化時,就要考慮是否因為伺服器上不同應用對資源的爭奪所造成的。

故,筆者建議,改善資料庫效能時第二個需要考慮的層面,就是要看看能否通過改善伺服器的配置來實現。

第三層:資料庫伺服器

當通過改善網路環境或者提高伺服器配置,都無法達到改善資料庫效能的目的時,接下去就需要考察資料庫伺服器本身了。首先,就需要考慮資料庫伺服器的配置。

一方面,要考慮資料庫伺服器的連線模式。提供了很多的資料庫模式,不同的資料庫連線模式對應不同的應用。若資料庫管理員能夠熟悉企業自身的應用,並且選擇合適的連線模式,這往往能夠達到改善資料庫效能的目的。

其次,合理配置資料庫伺服器的相關作業。如出於安全的需要,資料庫管理員往往需要對資料庫進行備份。那麼,備份的作業放在什麼時候合適呢?當然,放在夜晚,夜深人靜的時候,對資料庫進行備份最好。另外,對於大型資料庫,每天都進行完全備份將會是一件相當累人的事情。雖然累得不是我們,可是資料庫伺服器也會吃不消。差異備份跟完全備份結合將是改善資料庫效能的乙個不錯的策略。

第四層:資料庫物件

若以上三個層面後,資料庫效能還不能夠得到大幅度改善的話,則就需要考慮是否能夠調整資料庫物件來完成我們的目的。雖然調整資料庫物件往往可以提到不錯的效果,但是,往往會對資料庫產生比較大的影響。所以,筆者一般不建議使用者一開始就通過調整資料庫物件來達到改善資料庫效能的目的。

資料庫物件有表、檢視、索引、關鍵字等等。我們也可以通過對這些物件進行調整以實現改善資料庫效能的目標。

如在檢視設計時,盡量把其顯示的內容縮小,寧可多增加檢視。如出貨明細表,銷售人員可能希望看到產品編號、產品中英文描述、產品名字、出貨日期、客戶編號、客戶名字等等。但是,對於財務來說,可能就不需要這麼全的資訊。他們只需要產品編號、客戶編號、出貨日期等等少量的資訊即可。所以,能可浪費一點**的空間,設計兩張檢視,對應不同部門的需求。如此,財務部門在查詢資料時,不會為不必要的資料浪費寶貴的資源。

如可以通過合理設定索引來提高資料庫的效能。索引對於提高資料的查詢效率,有著非常好的效果。對一些需要重複查詢的資料、或者資料修改不怎麼多的表設定索引,無疑是乙個不錯的選擇。

另外,要慎用儲存過程。雖然說儲存過程可以幫助大家實現很多需求。但是,在萬不得已的情況下,不要使用儲存過程。而利用前台的應用程式來實現需求。這主要是因為在通常情況下,前台應用程式的執行效率往往比後台資料庫儲存過程要高的多。

第五層:sql 語句

若以上各個層面你都努力過,但是還不滿足由此帶來的效果的話,則還有最後一招。通過對sql語句進行優化,也可以達到改善資料庫效能的目的。

雖然說sql server伺服器自身就帶有乙個sql語句優化器。他會對使用者的sql語句進行調整、優化,以達到乙個比較好的執行效果。但是,據筆者的了解,這個最多隻能夠優化一些粗略的層面。或者說,80%的優化仍然需要資料庫管理員的配合。要資料庫管理員跟sql優化器進行配合,才能夠起到非常明顯的作用。

不過,sql語句的調整對於普通資料庫管理員來說,可能有一定的難度。除非受過專業的訓練,一般很難對sql語句進行優化。還好筆者受過這方面的專業訓練,對這方面有比較深的認識。如在sql語句中避免使用直接量。任何乙個包含有直接量的sql語句都不太可能被再次使用。我們資料庫管理員要學會利用主機變數來代替直接量。不然,這些不可再用的查詢語句將使得程式快取被不可再用的sql語句填滿。這都是平時工作中的一些小習慣。

順時針從外到內列印數字矩陣

列印數字矩陣到標準輸出。按順時針方向,從外到內列印矩陣。起點是矩陣的左上角。class matrix def initialize width n 0 width width 矩陣的寬度 建立二維陣列 square array.new width do array.new width,0 enden...

SQL Server內連線 外連線 交叉連線

在資料庫查詢中,我們常常會用到的表連線查詢,而我自己在工作中也是時常用這些表連線查詢。而就在剛剛我卻還沒有搞清楚資料庫表連線到底有哪幾種,這幾種表連線查詢方式又有什麼區別,實屬慚愧!藉以此文以謹記。資料庫表連線查詢分三種 內連線 外連線 交叉連線 那下面我們就來分別說說這三種連線。內連線又分為 等值...

解題 從外到內順時針列印給定矩陣(C 實現)

輸入乙個矩陣,按照從外到內以順時針依次列印每乙個數字。例如輸入如下矩陣 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 則依次列印 1 2 3 4 5 10 5 10 9 8 7 6 1 6 7 8 9 4 3 2 演算法描述 利用迴圈實現,每次迴圈列印矩陣中的乙...