查詢優化的目的是提高數據檢索速度,提高數據檢索意味着減少磁盤 IO 讀取或者邏輯內存讀取次數,這需要從兩個方面入手:數據要儘可能的緩存到內存、儘可能的使用索引。內存的問題可以參見 : http://msdn.microsoft.com/zh-cn/library/ms188284.aspx ,本文主要是體現如何使用索引來提高速度。具體方法:
1) 養成良好的編程習慣,比如SARG 優化(這個好像來自於sybase )
2) 使用查詢計劃,看某一個查詢是否是使用了索引,是否是使用了臨時表,儘量使用索引,避免臨時表
3) 使用查詢優化顧問,它可以幫助你判斷查詢是否優化,並提示你建立索引
4) 使用SET STATISTICS IO 命令,查看磁盤讀取次數,儘量物理磁盤和邏輯讀取次數少
5) 建立主鍵,主鍵是聚簇索引,數據行基於聚集索引鍵按順序存儲
6) 使用組合索引,避免OR 操作符使用臨時表,select * from table where a=1 or b=2, 可以考慮創建a and b 的組合索引
7) 大數據量表使用已分區表,具體參見:
http://msdn.microsoft.com/zh-cn/library/ms345146 ( SQL.90 ) .aspx
8) 使用存儲過程代替複雜sql 語句
9) 存儲過程中使用表變量而不使用臨時表,通常,表變量可提供更有效的查詢 處理: table 變量的行爲類似於局部變量,有明確定義的作用域;在存儲過程中使用 table 變量與使用臨時表相比,減少了存儲過程的重新編譯量;涉及 table 變量的事務只在 table 變量更新期間存在。因此減少了 table 變量對鎖定和記錄資源的需求。但不能顯式創建 table 變量的索引,也不保留 table 變量的任何統計信息。在某些情況下,可以通過改用支持索引和統計信息的臨時表來改善性能。具體參見:
http://msdn.microsoft.com/zh-cn/library/ms175010.aspx
10) 當必須對臨時表顯式地創建索引時,或多個存儲過程或函數必須使用表值時,臨時表很有用。使用大容量日誌模式可以提高臨時表大量插入數據的效率。