SQL优化准则
?1. 在長時間運行的查詢和短查詢中使用事務
如果預期有一個長時間運行的查詢,并且有大量的數據輸出時,開發者就應該在BEGIN TRAN 和END TRAN之間使用事務。
這樣事務會在緩沖區緩存為獨立事務,并會被分配特定內存,以此來提高處理速度。
2. 不要使用SELECT *
如果使用SELECT * 來選擇表中的所有記錄,那么一些不必要的記錄也被讀取、緩存,增加了磁盤的I/O和內存消耗。
3. 避免在WHERE子句中使用顯式或隱式函數,比如Convert ()
4. 避免在觸發器中執行長時間的操作
5. 適當使用臨時表和表變量
當結果集較小的時候,請盡量使用表變量;當結果集相當大時,使用臨時表。
6. 使用連接(JOIN)代替子查詢(Sub-Queries)
子查詢通常作為內聯代碼來使用,而連接(JOIN)則作為表來使用,這樣速度會更快。所以,應盡量避免在連接中使用子查詢。
7. 連接條件中表的順序
在連接條件中,應盡量首先使用較小的表,然后逐步使用較大的表。
8. 循環優化
如果操作在循環內部沒有任何影響,那么應盡量將操作放到循環外面,這樣可以減少不必要的重復工作。因為,SQL Server優化器不會自動識別這種低效率的代碼,更不會自動優化(其他一些語言的編譯器可以)。
9. 參數探測
不要在正執行的SP(存儲過程)中使用SP參數,這樣會導致參數探測(Parameter Sniffing)。應該在聲明和設置后再使用SP參數。由于這個原因,SP的行為在每次運行期間都不相同。
10. 當使用條件語句時,可以使用Index(索引)Hint(提示)
比如在SQL Server 2008中,可以使用Index hint,也可以使用fixed plan hint強制在查詢中使用hint,以提高運行速度。
11. 在聲明中明確指定存儲過程中數據類型的大小
開發者隨機聲明數據類型的大小是不可取的,如:Varchar (500)。這在執行時會在緩沖區中增加不必要的預留空間。
12. 在查詢中有效利用MAXDOP(最大并行度)設置
詢問數據庫管理員關于四核CPU可用性的設置,包括內存的設置,然后適當使用hint,可以有效改善查詢速度。
13. SQL Server 2008中的GROUPING SETS
如果數據庫服務器為SQL Server 2008,那么可以在所有的Unions中使用Grouping Set來代替Group By。這樣在Union中重新進行group by排序時,優化器不會每次都制定一個計劃。
14. 當發生死鎖時,總是使用With (nolock) 和With (rowlock)
15. 使用Update From,而不是簡單的Update
16. 使用UNION ALL代替UNION
UNION和UNION ALL的差別就在于UNION會對數據做一個distanct的動作,而這個distanct動作的速度則取決于現有數據的數量,數量越大時間越長。因此盡量使用UNION ALL來代替UNION。
17. 避免高成本操作,如NOT LIKE?
轉載于:https://blog.51cto.com/yaomingkai/1131609
總結
- 上一篇: [Java]关于throw,throws
- 下一篇: 【 2013华为杯编程大赛成都第三组前两