1. 程式人生 > 資料庫 >SQLServer 高併發下的 【表變數,臨時表,公共表表達式】的效能比拼(HIS3)

SQLServer 高併發下的 【表變數,臨時表,公共表表達式】的效能比拼(HIS3)

標題:一次高併發下的sql分析,及最終解決方法:

現象:pagelatch_ch,pagelatch_ex 資源等待多

 

1. 對bulk insert 的使用方式改造,1000條以上的資料才會用bulk insert (資料條目少的時候使用insert 命令)


2. order 中使用了大量的表變數,對tempdb 的效能要求比較高,經常出現 pagelatch_ch,pagelatch_ex 的等待,為此將tempdb 的檔案數量調整至 與資料庫伺服器的CPU核心數 等同,tempdb的資料檔案檔案的大小和增長值要一樣;但最終將部分表變數改造為 公共表表達式寫法 with cte 方式 

       注1. SQLServer 【表變數,臨時表】效能比對(表變數比臨時表效能好,造成的pagelatch_sh,pagelatch_ex 等待更少,在tempdb 檔案數與cpu 核心數一致的情況下)
具體效能比對結果如下:https://channel9.msdn.com/Series/SQL-Workshops/Tempdb-Metadata-Contention-in-SQL-Server-Table-Variable-Vs-Temporary-Table)

       注2:過多的表變數會導致sqlserver tempdb 元資料爭用(tempdb metadata 上會有pagelatch_sh,pagelatch_ex資源等待 ),後續把表變數逐步改善為 WITH CTE 寫法(公用表表達式common table express(CTE));CTE 表示式比 表變數效率更高或持平,但是不會對tempdb進行資源消耗,不會導致tempdb 的元資料資源等待
https://www.cnblogs.com/xmliu/p/7085644.html?utm_source=itdadao&utm_medium=referral

 

3.將事務的隔離級別進行調整:SERIALIZABLE(可序列化)->READ COMMITTED(已提交讀,預設級別) [https://www.cnblogs.com/chenmh/p/3998614.html]