SQL開發效率注意事項

2021-07-15 06:44:37 字數 2743 閱讀 1486

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...