SQL語句優化之經典總結

2021-07-12 07:42:23 字數 1977 閱讀 4593

***不可不優化的where子句  

----------------------------

1.例:下列sql條件語句中的列都建有恰當的索引,但執行速度卻非常慢:  

select * from record where substring(card_no,1,4)='5378'(13秒)  

select * from record where amount/30< 1000(11秒)  

select * from record where convert(char(10),date,112)='19991201'(10秒)  

分析:  

where子句中對列的任何操作結果都是在sql執行時逐列計算得到的,因此它不得不進行表搜尋,而沒有使用該列上面的索引;  

如果這些結果在查詢編譯時就能得到,那麼就可以被sql優化器優化,使用索引,避免表搜尋,因此將sql重寫成下面這樣:  

select * from record where card_no like'5378%'(< 1秒)  

select * from record where amount< 1000*30(< 1秒)  

select * from record where date= '1999/12/01'(< 1秒)  

你會發現sql明顯快起來!  

2.例:表stuff有200000行,id_no上有非群集索引,請看下面這個sql:  

select count(*) from stuff where id_no in('0','1')(23秒)  

分析:where條件中的'in'在邏輯上相當於'or',所以語法分析器會將in ('0','1')轉化為id_no ='0' or id_no='1'來執行。  

我們期望它會根據每個or子句分別查詢,再將結果相加,這樣可以利用id_no上的索引;  

但實際上(根據showplan),它卻採用了"or策略",即先取出滿足每個or子句的行,存入臨時資料庫的工作表中,再建立唯一索引以去掉重複行,最後從這個臨時表中計算結果。因此,實際過程沒有利用id_no上索引,並且完成時間還要受tempdb資料庫效能的影響。  

實踐證明,表的行數越多,工作表的效能就越差,當stuff有620000行時,執行時間竟達到220秒!還不如將or子句分開:  

select count(*) from stuff where id_no='0'   select count(*) from stuff where id_no='1'  

得到兩個結果,再作一次加法合算。因為每句都使用了索引,執行時間只有3秒,在620000行下,時間也只有4秒。  

或者,用更好的方法,寫乙個簡單的儲存過程:  

create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char(10)beginselect @a=count(*) from stuff where id_no='0'select @b=count(*) from stuff where id_no='1'endselect @c=@a+@bselect @d=convert(char(10),@c)print @d  

直接算出結果,執行時間同上面一樣快!  

總結:可見,所謂優化即where子句利用了索引,不可優化即發生了表掃瞄或額外開銷。  

1.任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊。  

2.in、or子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引。  

3.要善於使用儲存過程,它使sql變得更加靈活和高效。  

從以上這些例子可以看出,sql優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充份利用索引,減少表掃瞄的i/o次數,盡量避免表搜尋的發生。其實sql的效能優化是乙個複雜的過程,上述這些只是在應用層次的一種體現,深入研究還會涉及資料庫層的資源配置、網路層的流量控制以及作業系統層的總體設計。  

常用SQL語句優化技巧總結 經典

除了建立索引之外,保持良好的sql語句編寫習慣將會降低sql效能問題發生。通過變數的方式來設定引數 好 stringsql select from people p where p.id 壞 stringsql select from people p where p.id id 資料庫的sql文解...

sql 語句優化總結

我們如何更迅速的從乙個大型專案中,知道是什麼影響了服務的效能。mysql 提供了一些常用的命令來查詢資料庫的執行狀態。1.show status like uptime 檢視mysql資料庫執行了多長時間 2.show status like com select 檢視mysql 資料庫的查詢次數 ...

SQL語句優化總結

開發過程中必不可少的就是對資料庫的操作,也就離不開sql語句的書寫,我們也就需要考慮到sql語句的執行速度,需要書寫規範和優化。1.避免進行全表掃瞄。避免使用 select 用表中具體的列來查詢 select from user select id,name,phone,from user 2.避免...