1、能用DISTINCT的就不用GROUP BY
SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
可改為: SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
2.能用UNION ALL就不要用UNION
UNION ALL不執行SELECT DISTINCT函數,這樣就會減少很多不必要的資源
3.盡量不要用SELECT INTO語句。
SELECT INOT 語句會導致表鎖定,阻止其他使用者訪問該表。
4.能夠用BETWEEN的就不要用IN
5.exists代替in
select num from a where num in(select num from b)
可改為: select num from a where exists(select 1 from b where num=a.num)
6.避免在 where 子句中對欄位進行運算式操作(計算、Format等等),這將導致引擎放棄使用索引而進行全表掃描。
如: SELECT * FROM T1 WHERE F1/2=100
應改為: SELECT * FROM T1 WHERE F1=100*2
SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=‟5378‟
應改為: SELECT * FROM RECORD WHERE CARD_NO LIKE „5378%‟
SELECT member_number, first_name, last_name FROM members WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
應改為: SELECT member_number, first_name, last_name FROM members WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
即:任何對列的操作都將導致表掃描,它包括資料庫函數、計算運算式等等,查詢時要儘可能將操作移至等號右邊。
7.表中是否存在某條紀錄不要用count(*)那樣效率很低,而且浪費伺服器資源。可以用EXISTS代替。
如: IF (SELECT COUNT(*) FROM table_name WHERE column_name = „xxx‟)
可以寫成: IF EXISTS (SELECT * FROM table_name WHERE column_name = „xxx‟)