SQL Server 數據庫的整理優化的基本過程(一)
高建剛
作爲系統的重要一個部分,數據庫的性能在系統的運行過程中起到了非常關鍵的作用,系統的運行過程中,我們經常遇到客戶抱怨系統運行的太慢,統計一個月的報表經常會出現超時的情況,面對這些問題,我們應該如何處理哪?程序優化和數據庫優化要同步進行,程序方面應該從編寫的 T-SQL 語句、數據庫的訪問引擎、系統的架構設計等方面,當然了 WEB Form 的程序還要考慮到應用服務器以及 IIS 的問題等等,這是個系統架構師的問題,在此不多涉及。對我來說最關心的還是如何從數據庫方面來優化數據庫,下面就結合我個人的從業經驗對數據庫的優化做一個簡單的介紹。
首先,當我們面對一個數據庫時,我們應該從基礎慢慢的去整理,使之成爲一個基本正常運行的數據庫,這其中包含了很多的信息,由於一個系統的開發、實施、調試過程中都有可能會對數據庫的正常運行造成一定的影響,所以我們要從基礎着手,看看是否是正常運行的數據庫,即便這個數據庫是非常陌生的,我們也可以慢慢的去整理,以便達到初期的整理優化的效果。
查看是否所有的表都有主鍵。一個表沒有主鍵會造成各種各樣的問題,我們可以通過以下語句:
select NAME
from sysobjects T1
where xtype = 'U'
AND objectproperty ( object_id ( T1. Name), 'IsUserTable' )= 1
AND objectproperty ( object_id ( T1. Name), 'TableHasPrimaryKey' )= 0
ORDER BY [NAME]
通過上述語句的執行,我們會發現,數據庫中有哪些表沒有主鍵約束,對這些表,要進行分析,增加主鍵。
下一步,我們來看看聚集索引,相信很多人對於聚集索引造成的性能問題印象已經很深了,幾乎涉及到性能兩個字的時候,我們就會想到索引這個詞。通過下邊的語句我們可以找到那些表沒有聚集索引:
SELECT NAME
FROM sysobjects T1
WHERE xtype = 'U'
AND objectproperty ( object_id ( T1. Name), 'IsUserTable' )= 1
AND objectproperty ( object_id ( T1. Name), 'TableHasClustIndex' )= 1
ORDER BY [NAME]
缺少聚集索引的表,處理的時候要慎重,怎麼樣建立合適的聚集索引是需要仔細考慮的,有時候,聚集索引建立的不好,會導致索引碎片的頻繁增加,最重導致更加失敗的性能表現,所以要從應用、表結構、數據產生的順序等多方面考慮,然後再確定聚集索引的鍵值,維護好完成聚集索引後,通過實際應用來查看性能是否有所改善。
下一節中,我們將重點關注到索引的優化。