有沒有發現公司的 SQL Server 好像越來越慢,做什麼也好像力不從心?如果你有這樣的情況,會不會第一時間你就想到要提升硬件去應付增加的需求?但你又有沒有想過是因為 SQL Server 不是用最理想的方法來執行軟件所指派的工作而令到她要用多了時間去完成同樣的工作?
首先大家要了解 SQL Server 是怎樣去執行 SQL SELECT Query 的。SQL Server 有一個叫做查詢最佳化工具 (Query Optimizer),這工具是依據 SQL 陳述式和一些關於數據庫的統計資料去決定怎樣執行 SELECT Query。說到這裡,大家都會想到如果那些統計資料不正確的話是會影響到 SELECT Query 執行的。所以 SQL Server 預設是會自動更新那些統計資料的。但這些統計資料是依據什麼來計算出來的?其中之一就是 Index。
基本 SQL Server 的 Index 是依據平衡樹 (Balance Tree) 的方法來建構的。簡單的去說就是把用來排序的資料平均分開左右兩邊,然後不停重複直到不能再分為止。這樣的話,要去找資料就可以用一個快點的方法去找到要的資料:找的時候就只要看資料是在左或右邊,然後不停重複直到找到要找的資料為止。
從上面的圖來看,如果我們要找 A 就只需要幾個動作就好了。不需要從頭到尾的把所有的資料都看一次才可以確定我們要的資料在那。這個從頭到尾所有資料看一次的動作叫做 Full Table Scan。一般情況下我們是要避免 Full Table Scan 的出現。
但這種 Index 也有一個問題,就是如果有很多的資料改變的話,有機會令到這個樹不平衡而令到 SQL Server 要做多很多的工作才可以把資料找出來。要解決這個問題,最簡單的方法就是重建 Index。這可以令到這些 Index 回到最佳的情況而令到 SQL Server 的表現回到最初的狀態。我試過有一次在客戶那邊只是做了重建 Index 就把一個要用超過六分鐘的 SELECT Query,變回只要一分鐘不用就完成了。
我們一般會要求客戶最少一個月做一次重建 Index,以確保 SQL Server 在最佳的狀態下運作