一、PAGELATCH_x和PAGEIOLATCH_x介紹
相關介紹、處理,參考:https://www.pianshen.com/article/3284541245/
PAGELATCH_
PAGELATCH_和 上面講述的PAGEIOLATCH_ 看似很像,但中間少了 IO 這個關鍵。
- 磁盤中 ——> 內存中 ——> 最終使用
磁盤中——>內存中 的等待為PAGEIOLATCH_ 而 內存中——> 最終使用 的等待為 PAGELATCH_
當數據已經在內存中的時候SQL SERVER 想要使用這個數據頁就要給這個數據頁加鎖。
當等待中出現很多PAGELATCH_ 等待,那么可以說明:
- SQL Server沒有明顯的內存和磁盤瓶頸。
- 應用程序發來大量的並發語句在修改同一張表格里的記錄,而表格架構設計以及用戶業務邏輯使得這些修改都集中在同一個頁面,或者數量不多的幾個頁面上。這些頁面有的時候也被稱為Hot Page。這樣的瓶頸通常只會發生在並發用戶比較多的、典型的OLTP系統上。
- 這種瓶頸是無法通過提高硬件配置解決的,只有通過修改表格設計或者業務邏輯,讓修改分散到盡可能多的頁面上,才能提高並發性能。
二,Latch和性能
1,數據的IO操作
SQL Server訪問的任何一個Page必須存在於內存中,如果不存在於內存中,那么SQL Server發出 Disk IO請求,將數據頁從Disk讀取到內存中,然后SQL Server從內存中讀取該Page的內容。在訪問任何一個內存page之前,必須申請和獲取該Page上的Latch。
在數據讀取的過程中,SQL Server先在內存中預留一個Page的空間,並設置該Page的位BUF_IO=1,並發出Disk IO請求,此時,在該Page上加的Latch是PageIOLatch_EX,表示正在將數據頁從Disk讀取到內存。
在數據頁加載的過程中,任何一個讀取該Page的Thread,在該Page上加的Latch是PAGEIOLATCH_SH,表示在SQL Server Engine從Disk讀取數據頁,寫入內存時,Thread試圖讀取該Page,由於PAGEIOLATCH_SH和PageIOLatch_EX不兼容,讀取該Page的Thread會被Block,直到Page被讀取到內存中。
一旦數據頁被寫入到內存中,PageIOLatch_EX會立即釋放,並設置該Page的位BUF_IO=0。由於數據頁存在於內存中,對該Page申請的Latch是PageLatch。
如果發生PAGEIOLATCH類型的等待,那么SQL Server一定是在等待Disk I/O操作的完成。如果經常出現這類等待,說明磁盤速度不能滿足要求,已經成為SQL Server的瓶頸。PAGEIOLATCH_XX主要分為兩大類:PAGEIOLATCH_SH和PAGEIOLATCH_EX。
PAGEIOLATCH_SH 發生在用戶訪問一個數據頁,同時SQL Server正在將數據頁從磁盤寫入內存,經常發生PAGEIOLATCH_SH等待,說明內存不夠大,導致SQL Server需要做很多頁面讀取的操作,磁盤IO是內存壓力的副作用。
PAGEIOLATCH_EX:發生在從Disk page讀取到內存buffer中,經常發生PAGEIOLATCH_EX等待,說明Disk讀取速度慢,這和內存沒直接關系。
2,數據頁成為HotPage
當一個Task要修改頁面時,它必須先申請一個EX的Latch,即PageLatch_EX。只有獲取到Latch,才能修改頁面的內容。由於數據頁的修改都是在內存中完成,所以時間應該非常短,可以忽略不計。而PAGELATCH_EX只是在修改過程中才出現,所以生存周期應該很短,如果出現了,說明:1、SQL Server沒有明顯的內存和磁盤瓶頸。2、應用程序發出大量的並發語句修改同一張表,而修改操作集中在同一個頁面,或者數量不多的幾個頁面上,成為Hot Page。3、這種瓶頸無法通過提高硬件配置解決,只能修改 Table的存儲,使修改分散在更多的Page上,提高並發修改的能力。
Hot page的緩解方法:
(1)、換一個數據列建聚集索引,而不要在Identity字段上,同一時間插入有機會分散到不同的頁面上。
(2)、如果一定要在Identity的字段上建聚集索引,建議在其他某個列上創建若干個分區。
(3)、為FileGroup增加File,盡量將Files分布在不同的Physical Disk上。
3,在tempdb中,系統Page成為Hot Page
SQL Server不僅在數據頁面上加Latch,而且在數據文件的系統頁面上,例如SGAM、PFS和GAM頁面等,也會加Latch。系統Page有時候也會成為系統瓶頸。
在創建新表時,SQL Server 需要分配空間。分配存儲空間需要同時修改SGAM、PFS和GAM頁面,設置標識位,由於一個系統Page的標志位管理很多數據頁,當頻繁的創建和刪除表結構時,而這些數據頁都發生在同一個系統Page,或者數量不多的幾個系統Page上,會使該系統Page過熱,成為Hot Page。在tempdb中,創建和刪除table結構的操作會並發、反復發生,容易使系統頁過熱,產生hot Page。系統page過熱,可以通過調整表設計來緩解。對此的解決方法:
- 建立與cpu數量相同的tempdb文件,保持File Size相同,使得每個File承擔的IO壓力相對平均
- 禁止 tempdb 文件自動增長,避免單個文件不平均增長
一、參考:PAGELATCH_x和PAGEIOLATCH_x介紹
二、參考:https://www.cnblogs.com/ljhdo/p/4917150.html