sql语句的效率
1、盡量避免反復訪問同一張或幾張表,尤其是數據量較大的表,可以考慮先根據條件提取數據到臨時表中,然后再做連接。
2、盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該改寫;如果使用了游標,就要盡量避免在游標循環中再進行表連接的操作。
3、注意where字句寫法,必須考慮語句順序,應該根據索引順序、范圍大小來確定條件子句的前后順序,盡可能的讓字段順序與索引順序相一致,范圍從大到小。
4、不要在where子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
??? 例如:在報關單表頭上ENTRY_ID有索引。SELECT * FROM ENTRY_HEAD WHERE? LEFT(ENTRY_ID,2)=’01’改為SELECT * FROM ENTRY_HEAD WHERE ENTRY_ID LIKE ‘01%’性能會比較高。
5、盡量使用exists代替selectcount(1)來判斷是否存在記錄,count函數只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
6、盡量使用“>=”,不要使用“>”。
7、注意一些or子句和union子句之間的替換
例如下面的查詢:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是語句還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。
8、注意表之間連接的數據類型,避免不同類型數據之間的連接。
9、注意存儲過程中參數和數據類型的關系。
10、注意insert、update操作的數據量,防止與其他應用沖突。如果數據量超過200個數據頁面(400k),那么系統將會進行鎖升級,頁級鎖會升級成表級鎖。
11、索引的創建要與應用結合考慮,建議大的OLTP表不要超過6個索引。
12、盡可能的使用索引字段作為查詢條件,尤其是聚簇索引,必要時可以通過indexindex_name來強制指定索引
13、避免對大表查詢時進行tablescan,必要時考慮新建索引。
14、在使用索引字段作為條件時,如果該索引是聯合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用。
15、盡量避免使用distinct、orderby、groupby、having、join、cumpute,因為這些語句會加重tempdb的負擔。
16、在新建臨時表時,如果一次性插入數據量很大,那么可以使用select into代替createtable,避免log,提高速度;如果數據量不大,為了緩和系統表的資源,建議先createtable,然后insert。
17、如果臨時表的數據量較大,需要建立索引,那么應該將創建臨時表和建立索引的過程放在單獨一個子存儲過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。
18、如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先truncatetable,然后droptable,這樣可以避免系統表的較長時間鎖定。
19、避免相關子查詢
一個列的標簽同時在主查詢和where子句中的查詢中出現,那么很可能當主查詢中的列值改變之后,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那么要在子查詢中過濾掉盡可能多的行。
20、避免困難的正規表達式
MATCHES和LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在這種情況下也還是采用順序掃描的方式。如果把語句改為SELECT * FROM customer WHERE zipcode >“98000”,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
另外,還要避免非開始的子串。例如語句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非開始子串,因而這個語句也不會使用索引。
轉載于:https://www.cnblogs.com/evangel/archive/2009/03/14/1411772.html
總結
- 上一篇: 获取构造器的信息
- 下一篇: 一文讲透蓝牙、WiFi、ZigBee无线