SQL語句優化
1、在查詢中不要使用“select *” 檢索不必要的列會帶來額外的系統開銷,有句話叫做“該省的則省”;
2、在select清單中避免不必要的列,在連接條件中避免不必要的表;
3、不要在子查詢中使用count()求和執行存在性檢查
4、避免使用兩個不同類型的列進行表的連接
5、避免死鎖
6、避免使用count(*)獲得表的記錄數
(1)為了獲得表中的記錄數,我們通常使用下面的SQL 語句: SELECT COUNT(*) FROM dbo.orders 這條語句會執行全表掃描才能獲得行數。 (2)但下面的SQL 語句不會執行全表掃描一樣可以獲得行數: SELECT rows FROM sysindexes
WHERE id = OBJECT_ID(‘dbo.Orders‘) AND indid < 2
7、避免使用動態SQL。(1)動態SQL 難以調試和故障診斷; (2)如果用戶向動態SQL 提供了輸入,那麽可能存在SQL 註入風險。
8、在寫存儲過程中,在開始寫set nocount on ,結束寫set nocount off
(當 SET NOCOUNT 為 ON 時,不返回計數(表示受Transact-SQL 語句影響的行數)。 當 SET NOCOUNT 為 OFF 時,返回計數(默認為OFF)。
即使當 SET NOCOUNT 為 ON 時,也更新 @@ROWCOUNT 函數。
當 SET NOCOUNT 為 ON 時,將不給客戶端發送存儲過程中的每個語句的 DONE_IN_PROC 信息。當使用 Microsoft? SQL Server? 提供的實用工具執行查詢時,在 Transact-SQL 語句(如 SELECT、INSERT、UPDATE 和 DELETE)結束時將不會在查詢結果中顯示"nn 行受影響"。
如果存儲過程中包含的一些語句並不返回許多實際的數據,則該設置由於大量減少了網絡流量,因此可顯著提高性能。
SET NOCOUNT 設置是在執行或運行時設置,而不是在分析時設置。
註釋當SET NOCOUNT 為ON 時,不返回計數(表示受Transact-SQL 語句影響的行數)。當SET NOCOUNT 為OFF 時,返回計數。 ... 結論:我們應該在存儲過程的頭部加上SET NOCOUNT ON 這樣的話,在退出存儲過程的時候加上SET NOCOUNT OFF這樣的話,以達到優化)
SQL語句優化