1.所有的 select建議加nolock,更新語句加rowlock
select columename from tablename with(nolock) join tablename2 t2 with(nolock)
2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如: select id from t where num is null ,可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:select id from t where num=0
3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄。
應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
4.in 和 not in 也要慎用,否則會導致全表掃瞄,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
5.下面的查詢也將導致全表掃瞄:
select id from t where name like '%abc%'
若要提高效率,可以考慮全文檢索。
6.應盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:
6.1. select * from record wheresubstring(card_no,1,4)=』5378』
應改為:select * from record where card_no like 『5378%』
6.2. select member_number, first_name,last_name from members where
datediff(yy,datofbirth,getdate())> 21
應改為:select member_number, first_name, last_name frommembers
where dateofbirth 即:任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊。
7.應盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:
select id from t wheresubstring(name,1,3)='abc'--name以abc開頭的id
select id from t wheredatediff(day,createdate,'2005-11-30')=0--『2005-11-30』生成的id
應改為:
select id from t where name like'abc%'
select id from t wherecreatedate>='2005-11-30' and createdate<'2005-12-1'
8.很多時候用 exists 代替 in 是乙個好的選擇:
select num from a where numin(select num from b)
用下面的語句替換:
select num from a whereexists(select 1 from b where num=a.num)
9.任何地方都不要使用 select * from t ,用具體的字段列表代替「*」,不要返回用不到的任何字段。
10.盡量使用表變數來代替臨時表,但是當資料量比較大的時候,表變數的效率沒有臨時變數高。
11.避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。
12.臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個資料集時。但是,對於一次性事件,最好使用匯出表。
13.在新建臨時表時,如果一次性插入資料量很大,那麼可以使用 select into 代替 create table,以提高速度;如果資料量不大,為了緩和系統資源,應先create table,然後insert, 但是在儲存過程中,如果中間資料集比較大,盡量少用臨時變數
14.如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
15.盡量避免使用游標,因為游標的效率較差,如果游標操作的資料超過1萬行,那麼就應該考慮改寫。
16.充分利用連線條件,在某種情況下,兩個表之間可能不只乙個的連線條件,這時在 where 子句中將連線條件完整的寫上,有可能大大提高查詢速度。
1). selectsum(a.amount) from account a,card b where a.card_no = b.card_no
2). selectsum(a.amount) from account a,card b where a.card_no = b.card_no anda.account_no=b.account_no
第二句將比第一句執行快得多。
17.能用distinct的就不用group by
18.能用union all就不要用union
19.盡量全部用儲存過程
SQL開發注意事項
不要使用count 列名 或count 常亮 代替 count 說明 count 會統計值為null的行,而count 列 不會統計此列為null值的行。當某一列的值全為null時,count col 的返回結果為0,但sum col 的結果為null,所以使用sum 時需要注意npe問題。使用 i...
後端開發SQL注意事項
in操作在很多時候是可以優化查詢的,但是當有order by或者其他需要遍歷所有結果的語句時需要注意,如果in的內容比較多,應該分批查,例如select from table where name in and type in 1,2,3 order by id desc limit 10,如果要查...
SQL 注意事項
選擇表名 配置ctrl 3 能夠select 桌 use nb go 物 storedprocedure dbo sp select 指令碼日期 05 28 2015 21 46 25 set ansi nulls on go set quoted identifier on go create p...