SQL Server誤區(qū)30日談 第12天 TempDB的文件數(shù)和需要和CPU數(shù)目保持一致
誤區(qū) #12:TempDB的文件數(shù)和需要和CPU數(shù)目保持一致
錯誤
哎,由于上述誤區(qū)是微軟“官方”的建議,并且還有大量博文堅持這個觀點,這個誤區(qū)已經(jīng)是老生常談。
但讓人困惑的是SQL CAT團隊給出的建議就是1:1,但這個建議是源自擴展方面的原理來說,而不是一個通用法則。因為他們所面對的大型客戶數(shù)據(jù)量服務(wù)器和IO子系統(tǒng)都是大部分人沒有機會遇到的。
每個實例僅僅允許有一個TempDb,但需要用到TempDB的地方卻有很多,所以TempDB很容易成為性能瓶頸,我想大家數(shù)人都了解這一點,而大多數(shù)人所不了解的應(yīng)該是在什么情況下才需要額外的TempDB文件。
當(dāng)你看到PAGELATCH類型的阻塞時,說明遇到內(nèi)存中分配位圖的爭用問題了。而看到PAGEIOLATCH,說明遇到I/O子系統(tǒng)層面的爭用問題了。對于閂鎖(Latch)你可以將其看作和普通鎖是一種東西,但更輕量,更短,并且只會被存儲引擎內(nèi)部使用。
MVP Glenn Berry 有一篇博文里有查看sys.dm_os_wait_stats的DMV。這篇博文中可以查到你的服務(wù)器造成阻塞最多的原因是什么。如果你發(fā)現(xiàn)是PAGELATCH型等待,你可以使用這段腳本來查看是由于FPS,GAM還是SGAM爭用造成的問題。
如果你遇到閂鎖爭用,可以通過跟蹤標(biāo)記1118或是多建一個TempDB文件來緩和這個狀況(原理可以在知識庫KB 328551查到),我已經(jīng)寫了一篇關(guān)于為什么追蹤標(biāo)記1118依然被需要的長博文,鏈接:Misconceptions around TF 1118。
在SQL SERVER 2000時代,TempDB的文件數(shù)需要和CPU核數(shù)保持1:1的關(guān)系,在SQL SERVER 2005和2008版本這條建議也適用,但由于SQL SERVER 2005+后的優(yōu)化措施(詳細(xì)請看我的博文),你不再需要嚴(yán)格按照1:1的比例關(guān)系設(shè)置CPU核數(shù)和TempDB文件數(shù),而是文件數(shù)和CPU核數(shù)的比例保持在1:2或是1:4就行了。
[題外話:在SQL PASS 2011我的好朋友Bob Ward,也是SQL CSS最牛的人。給出了一個新的公式:如果CPU核數(shù)小于等于8,使其比例保持在1:1,而如果CPU核數(shù)大于8,使用8個文件,當(dāng)你發(fā)現(xiàn)閂鎖爭用現(xiàn)象時,每次額外加4個文件]
不過這也不能一概而論。上周我遇到一個問題,一個客戶的TempDB負(fù)載大到需要32個CPU配上64個TempDB文件才能減輕閂鎖爭用。這是否意味著這是一個最佳實踐呢?當(dāng)然不是。
那你或許有疑問,為什么1:1的比例不好呢,那是因為太多的TempDB有可能引起另一個性能問題。如果你的一條查詢中某些操作(比如排序)需要使用大量的內(nèi)存,但內(nèi)存不夠時,就需要將這些內(nèi)容分配到TempDB中。當(dāng)存在多個TempDB文件時,由于TempDB的循環(huán)分配機制,這有可能導(dǎo)致性能被拖累,對于比較大的臨時表也是如此。
那為什么循環(huán)分配機制對于TempDB存在大量文件時產(chǎn)生性能問題呢?有如下幾種可能:
- 循環(huán)分配算法是針對文件組而言,而對于TempDB只能存在一個文件組。當(dāng)這個文件組包含16或32個文件時,由于循環(huán)分配算法的線程有限,但對于大量文件的TempDB依然需要做一些額外的同步工作,因此這部分工作會造成性能損失
- TempDB的文件大小不一致,則有可能導(dǎo)致某個單獨文件的自動增長,從而造成熱點IO。
- 當(dāng)緩沖區(qū)需要通過LazyWriter釋放一些空間時(TempDB的Checkpoint不會做寫回操作),多個TempDB文件有可能導(dǎo)致IO子系統(tǒng)的隨機讀寫問題,這會導(dǎo)致IO方面的性能問題。
所以這個選擇讓你進亦憂,退亦憂。到底多少TempDB文件才是合適的呢?我也不能給你具體答案,但是基于我多年咨詢經(jīng)驗以及出席各種大會的經(jīng)驗,我可以給你一個指導(dǎo)方針---當(dāng)為了解決閂鎖爭用時為TempDB創(chuàng)建多個文件要小心,僅僅在必須情況下才額外增加TempDB文件。也就是你需要在可擴展性和性能之間取得一個平衡。
希望上面的指導(dǎo)方針對你有幫助。
PS:回應(yīng)一些評論:TempDB的文件沒有必要分布在多個存儲器之間。如果你看到PAGELATCH類型的等待,即使你進行了分布也不會改善性能,而如果PAGEIOLATCH型的等待,或許你需要多個存儲器,但這也不是必然-有可能你需要講整個TempDB遷移到另一個存儲系統(tǒng),而不是僅僅為TempDB增加一個文件。這需要你仔細(xì)分析后再做定奪。
相關(guān)文章
詳解SQL Server 中 JSON_MODIFY 的使用
SQL Server 從 2016 開始支持了一些 JSON操作,最近的項目里也是好多地方字段直接存成了 JSON,需要了解一下怎么在SQL Server 中操作 JSON.這篇文章主要介紹了SQL Server 中 JSON_MODIFY 的使用,需要的朋友可以參考下2019-11-11sqlserver 多庫查詢 sp_addlinkedserver使用方法(添加鏈接服務(wù)器)
mssql在使用多庫查詢的時候會用到鏈接服務(wù)器,以下為鏈接服務(wù)器的添加方法,添加完了即可實現(xiàn)任意改服務(wù)器的多庫查詢了2011-08-08Centos 7.3下SQL Server安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Centos 7.3下SQL Server安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08更改SQL Server更改當(dāng)前數(shù)據(jù)庫的所有者:sp_changedbowner
更改SQL Server更改當(dāng)前數(shù)據(jù)庫的所有者:sp_changedbowner...2007-02-02sql使用cast進行數(shù)據(jù)類型轉(zhuǎn)換示例
這篇文章主要介紹了sql使用cast進行數(shù)據(jù)類型轉(zhuǎn)換,需要的朋友可以參考下2014-03-03sql中count或sum為條件的查詢示例(sql查詢count)
在開發(fā)時,我們經(jīng)常會遇到以“累計(count)”或是“累加(sum)”為條件的查詢,下面使用一個示例說明使用方法2014-01-01MSSQL中刪除用戶時數(shù)據(jù)庫主體在該數(shù)據(jù)庫存中擁有架構(gòu) 無法刪除的解決方法
在ms sql2005 下面刪除一個數(shù)據(jù)庫的用戶的時候提示 數(shù)據(jù)庫主體在該數(shù)據(jù)庫中擁有架構(gòu),無法刪除的錯誤解決方案2013-08-08