開發者必備的SQL效能優化基本功

2021-06-07 19:35:38 字數 1912 閱讀 4441

在網際網路應用,特別是「動態」**的應用中,隨著**訪問量的增加,我們總是會發現效能的瓶頸最先來自資料io,而非cpu、記憶體、網路頻寬……而資料io瓶頸一般表現在資料庫查詢上。

當然我們可以通過使用諸如 memcache 之類的集群快取方案替資料庫「擋」那麼一下,也可以考慮使用 hbase 之類的nosql解決方案分散資料訪問。但是最經濟、最快速的辦法莫過於sql語句優化了——幾乎零成本且立桿見影。優化一條糟糕的查詢,能輕鬆的提高千百倍的執行效率,而獲得的結果不會有任何不同。

說出來也許都知道,但未必都能記得做到。所以,總結一下:

select id from t where substring(name,1,3)='abc'——name以abc開頭的id

select id from t where datediff(day,createdate,'2010-11-30')=0——「2010-11-30」生成的id

可以改為:

select id from t where name like 'abc%'

select id from t where createdate>='2010-11-30' and createdate<'2010-12-1'

並不是所有索引對查詢都有效,sql是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,sql查詢可能不會去利用索引,例如表中有字段***,***的值為male、female,幾乎各佔一半,那麼即使在字段***上建了索引也對查詢效率起不了提公升作用。

索引並不是越多越好,索引固然可以提高相應的查詢效率,但同時也降低了插入和更新的效率,因為 insert 或 update 時有可能需要重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則需考慮其必要性了。

應盡可能的避免更新 clustered 索引(聚集索引,比普通索引速度更快)資料列,因為 clustered 索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。

盡量使用數字型字段,只含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連線的效能,並增加儲存開銷。這是因為資料庫引擎在處理查詢和連線時會逐個比較字串中每乙個字元,而對於數字型而言只需要一次比較就夠了。 

盡量使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段儲存空間小,可以節省儲存空間,其次對於查詢來說,在乙個相對較小的字段內搜尋效率顯然要高些。

盡量使用表變數來代替臨時表。

避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。

臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如當需要重複引用大型表或常用表中的某個資料集時。但是,對於一次性事件,最好使用匯出表。 

在新建臨時表時,如果一次性插入資料量很大,那麼可以使用 select into 代替 create table ,避免造成大量log,以提高效率;如果資料量不大,為了緩和系統表的資源,應先 create table ,然後 insert 。

如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

盡量避免使用游標,因為游標的效率較差,如果游標操作的資料超過1萬行,那麼就應該考慮改寫。 

使用基於游標的方法或臨時表方法之前,應先尋找基於結果集的解決方案,基於結果集的方法通常更有效率。 

與臨時表一樣,游標並不是不可使用。對小型資料集使用 fast_forward 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括「合計」的例程通常要比使用游標執行的速度快。 

如果開發時間允許,基於游標的方法和基於結果集的方法都可以嘗試一下,看哪一種方法的效果更好。

最後,應當盡量避免大事務操作(即避免長時間鎖表),提高系統併發能力。

開發者必備的SQL效能優化基本功

在網際網路應用,特別是 動態 的應用中,隨著 訪問量的增加,我們總是會發現效能的瓶頸最先來自資料io,而非cpu 記憶體 網路頻寬 而資料io瓶頸一般表現在資料庫查詢上。當然我們可以通過使用諸如 memcache 之類的集群快取方案替資料庫 擋 那麼一下,也可以考慮使用 hbase 之類的nosql...

開發者必備的 Chrome 擴充套件

firebug 不用多介紹了吧 chromesnifferplus chrome 探測器,可以探測正在使用的開源軟體或者 js 類庫 measureit 瀏覽器視窗內測距,用於測量元素的大小 window resizer 可以快速調整瀏覽器視窗的尺寸,用於觀察 頁面寬度 awesome screen...

開發者必備的 Chrome 擴充套件

firebug 不用多介紹了吧 chromesnifferplus chrome 探測器,可以探測正在使用的開源軟體或者 js 類庫 measureit 瀏覽器視窗內測距,用於測量元素的大小 window resizer 可以快速調整瀏覽器視窗的尺寸,用於觀察 頁面寬度 awesome screen...