茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1672184 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_0016.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

DB研討會 : [分享]SQL查詢最佳化

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]SQL查詢最佳化

影響資料庫效能的重要因素不外乎以下四個:
1. 資料庫的邏輯設計
2. 資料庫的實體設計
3. 伺服器的硬體規格
4. 索引規劃與SQL敘述


在資料庫邏輯設計方面
首先需要考慮資料庫主要是用於儲存交易資料還是分析資料(OLAP)?如果是交易資料庫,則儘可能做到第三正規化,以減少重覆的資料,節省儲存的空間。當資料列變少時,有助於資料的排序與索引,但無可避免的,資料表數目與關聯反而會變多,增加查詢的複雜度。如果只是分析資料庫,對正規化的要求,反而就沒有必要了。

在資料庫實體設計方面
特別是一些大型的資料表,可以考慮垂直或水平的分割,並分別放在不同的磁碟中,以提高查詢的效能。另外將資料與索引分開存放,也是達到相同的效果。

在伺服器的硬體規格方面
如果在預算許可的情況下,硬體升級也是不錯的方案。硬體升級可分為垂直延展(scale up)與水平延展(scale out)兩種,其中垂直延展是指更換更高級的CPU或更高轉速的硬碟、增加CPU或RAM數量等。水平延展則是指使用多部伺服器建立伺服器叢集,增加處理容量,提高效能。

在索引規劃與SQL敘述方面
良好的索引規劃是資料庫效能的基礎。簡單來說,索引就像一本書的目錄,透過目錄可以快速找到所需的內容,建立索引也是相同的道理。索引可以分成叢集索引與非叢集索引。一個資料表只能有一個叢集索引,但可以有多個非叢集索引。叢集索引與叢集索引的主要差別在於叢集索引的順序與資料實體儲存的順序有關,而非叢集索引則與資料實體儲存沒有直接的關係。


SQL敘述是管理與存取資料庫的唯一途徑,執行時往往會耗用70%以上的系統資源,由此可見SQL敘述對資料庫效能的重要性。SQL敘述的特色是易學易懂,但難於精通。相同的結果,可以有不同的寫法,因此如何撰寫良好效能的SQL敘述是資料庫開發人員的一大挑戰。

本文將重點放在第四個部份。如何建立適合的索引與選擇索引類型。另外也簡單說明了撰寫SQL敘述時的注意事項與哪些替代的寫法?

在正式進入主題之前,先對效能的評估有個基本的認識。通常我們可以從下面兩個方面來評估效能是否需要改善,以及改善的程度。首先可以檢查邏輯讀取(logic reads)(註1)的次數。讀取的次數越小,表示查詢效能越佳,反之則越差。另外也可以檢查執行計畫,如果有使用了table scan或出現紅字,則表示尚有改善的空間,儘可能做到index seek。

索引規劃
哪些欄位適合建立索引?又有哪些不適合建立索引?一般而言,經常用於連結條件、查詢,以及排序或資料密度較高的欄位均適合建立索引。一些很少查詢、資料重複性太高的資料(例如性別),以及text與image等大型的資料均不適合建立索引。

良好的SQL敘述
SQL敘述的執行效能,可以從下面幾個方面來改善:
1. and與or的使用
and,可用於取代between。只有單一條件有索引,就會使用索引。條件越多,選擇性越多,速度也越快。
or,可用於取代in。當所有條件均有索引時,才會使用索引。例如找出姓林,名叫彼得的員工
select * from employee where lastname= '林' or firstname= '彼得'
如果只有在lastname欄位建立索引,也不會使用索引來查詢。
改善的作法是將SQL敘述分解成多個單一條件的SQL敘述,然後使用union將結果聯集來。

select * from employee where lastname= '林'
union
select * from employee where firstname= '彼得'
另外也可以在lastname和firstname建立複合索引,提高索引覆蓋率。

2. where子句僅可能不使用運算式

3. 僅可能少用like進行模糊查詢,特別是對於一些大型的資料表。

4. 僅可能使用stored procedure

事實上過多或不適當的索引均可能影響查詢與更新的速度,因此不建議自行建立索引。只要資料庫的邏輯設計是合理的,使用SQL Server提供的索引微調器便可以幫助您方便而有效地來建立索引。

註1:邏輯讀取的次數是指當執行SQL敘述時,讀取資料頁(page)的次數。為了檢查邏輯讀取的次數,請執行Set statistics IO ON開啟讀寫統計。

前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|