吳凱佳 陳少琴 李結映

摘要:在日常的工作中,或多或少會遇到一些較為復雜的sQL語句,當我們發現這些語句執行得慢時,總是會想辦法對其修改,讓它變得更快一些。本文探討研究了sQL SER VER下SQL的語句調優方法。
關鍵詞:sQL;優化;調優
中圖分類號:TP311.1 文獻標識碼:A 文章編號:1007-9416(2020)05-0051-01
1背景
一般在應用中,糟糕的SQL語句是造成系統性能低下的最主要原因,例如大小寫的不統一、同樣的sQL語句不同的寫法等。當業務數據量相對較少時,一些sQL的執行效率對程序運行效率的影響不太明顯,隨著數據量的增加,SQL的執行效率對程序的運行效率的影響逐漸增大,糟糕的sQL語句會使情況變得越來越嚴重,此時對sQL的優化就很有必要。
2SQL優化的一些方法
(1)通配符中Like的使用需注意,如select id,name fromusednfo where naille like%name%;或select id,name fromuserinfo where name like%name;該寫法由于name前面用了“%”,會造成全表的掃描,效率低下,select id,name from userinfowhere name likename%;這樣的的寫法執行效率快很多。
(2)避免在Where子句中對字段進行函數操作,where子句‘一左邊不要出現函數、算數運算或者其他表達式運算。如select id fromuserinfo where substring(name,l,6)=‘xiaomi;該語句對字段進行了函數處理,會導致查詢分析器放棄了索引的使用。正確的寫法應為select id from userinfo where name likexiaomi%。
(3)在子查詢當中,盡量用exists代替in,如select name fromusennfo a where id in(select id from userinfo b);可以改為select naille from userinfo a where exists(select l from userinfob where id=a.id)。
(4)where子句中盡量不要使用iS null或iS not null對字段進行判斷,例如:select id from userinfo where name iS null;盡量在數據庫字段中不出現null,如果查詢的時候條件為iS null,索引將不會被使用,造成查詢效率低,因此數據庫在設計的時候,盡可能將某個字段可能為空的時候設置默認值,那么查詢的時候可以根據默認值進行查詢,比如name字段設置為0,查詢語句可以修改為se-lect id from userinfo where name=0。
(5)避免在where子句使用or作為鏈接條件,如select id fromuserinfo where name=xiaomingor name=xiaowang;可以改寫為:select id from usefinfo where name=xiaomingunionall select id from userinfo where name='xiaowang'。
(8)一些沒有意義的查詢如:select coll,c012 into#t from twhere l=O;這類代碼不會返回任何結果集,但是會消耗系統資源,如需要生成一個空表結構,應改成:create table#t(…)。
(9)并不是所有索引對查詢都有效,sQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,sQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在seX上建了索引也對查詢效率起不了作用。
(10)盡可能使用varchari代替har,因為首先變長字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。
(u)避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。臨時表并不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是對于一次性事件,最好使用導出表。
(12)在新建臨時表時,如果一次性插入數據量很大,可以使用select into代替create table,避免造成大量log,以提高速度,如果數據量不大,為了緩和系統表的資源,應Ygcreate table,然后insert。
(13)如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先truncate table,然后drop table,這樣可以避免系統表的較長時間鎖定。
3結語
要對復雜的sQL進行優化,語句的執行順序可謂是重中之重,我們只有明確了執行順序,才能在后續簡化sQL的過程中有的放矢的進行。否則,如果方向錯了,再努力也是徒勞。所以我們要做到不但會寫sQL,還要做到寫出性能優良的sQL。