***不可不優化的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.避免...