SQL
SELECT子句中避免使用 「*」
刪除重複記錄
用TRUNCATE替代DELETE
計算記錄條數
用EXISTS替代IN
用EXISTS替換DISTINCT
用>=替代>
應盡量避免在 where 子句中對欄位判斷!
應避免在 where 子句中使用!=或<>操作符!
應避免在 where 子句中使用 or 連結!
in 和 not in 也要慎用
應避免在 where 子句中進行表達式操作
這將導致引擎放棄使用索引而進行全表掃描。如:
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())
即:任何對列的操作都將導致表掃描,它包括資料庫函數、計算表達式等等,查詢時要儘可能將操作移至等號右邊。
應避免在where子句中進行函數操作
這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'
–name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0
–『2005-11-30』生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>=』2005-11-30′ and createdate<'2005-12-1'
不要在 where 子句中的「=」左邊運算
進行函數、算術運算或其他表達式運算,系統將可能無法正確使用索引。
盡量避免向客戶端返回大數據量
若數據量過大,應該考慮相應需求是否合理。
避免使用不兼容的資料類型
例如float和int、char和varchar、binary和varbinary是不兼容的。資料類型的不兼容可能使優化器無法執行一些本來可以進行的最佳化操作。例如:
SELECT name FROM employee WHERE salary > 60000
在這條語句中,如salary欄位是money型的,則優化器很難對其進行最佳化,因為60000是個整型數。我們應當在編程時將整型轉化成為錢幣型,而不要等到運行時轉化。
充分利用連接條件
在某種情況下,兩個表之間可能不只一個的連結條件,這時在 WHERE 子句中將連接條件完整的寫上,有可能大大提高查詢速度。
例:
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO
第二句將比第一句執行快得多。
能用DISTINCT的就不用GROUP BY
SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
可改為:
SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
能用UNION ALL就不要用UNION!
UNION ALL不執行SELECT DISTINCT函數,這樣就會減少很多不必要的資源
盡量不要用SELECT INTO語句!
SELECT INTO 語句會導致表鎖定,阻止其他使用者訪問該表。