SQL Server 2016 TempDb里的顯著提升
幾個星期前,SQL Server 2016的最新CTP版本已經(jīng)發(fā)布了:CTP 2.4(目前已經(jīng)是CTP 3.0)。關(guān)于SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié),在此不多說了,具體內(nèi)容請查相關(guān)資料。這個預(yù)覽版相比以前的CTP包含了很多不同的提升。在這篇文章里我會談下對于SQL Server 2016,TempDb里的顯著提升。
TempDb定制
在SQL Server 2016安裝期間,第一個你會碰到的改變是在安裝過程中,現(xiàn)在你能配置TempDb的物理配置。我們可以詳細(xì)看下面的截屏。
微軟現(xiàn)在檢測幾個可用的CPU內(nèi)核,基于這個數(shù)字安裝程序自動配置TempDb文件個數(shù)。這個對克服閂鎖競爭問題(Latch Contention problem)非常重要,通常當(dāng)你運(yùn)行TempDb時,只有一個數(shù)據(jù)文件會發(fā)生。這里安裝向?qū)褂孟铝泄剑?/p>
當(dāng)你有小于等于8個CPU內(nèi)核,你會獲得和你CPU內(nèi)核數(shù)一樣的TempDb數(shù)據(jù)文件數(shù)。
如果你有超過8個CPU內(nèi)核,你會得到開箱即用的8個TempDb數(shù)據(jù)文件。
我在不同的配置上測試了安裝向?qū)?,下表總結(jié)了TempDb數(shù)據(jù)文件的不同個數(shù)。
CPU內(nèi)核 TempDb數(shù)據(jù)文件
2 2
4 4
8 8
32 8
這是一個巨大的進(jìn)步!當(dāng)我進(jìn)行SQL Server健康檢查時,TempDb只有一個數(shù)據(jù)文件,會有一些閂鎖競爭問題(Latch Contention problem)是常見的。
如果在向?qū)Ю锬闾峁┒鄠€數(shù)據(jù)路徑,你可以在各個文件夾之間循環(huán)(round-robin)分配。有一點(diǎn)我不喜歡的是,新的配置8MB的初始大小和64MB的自動增長率。
分配和自動增長
在SQL Server 2016之前,很多人使用1117和1118跟蹤標(biāo)記來定義SQL Server在數(shù)據(jù)庫里如何分配頁,和如何在多個數(shù)據(jù)文件間處理自動增長操作。在以前的SQL Server版本里,臨時表的數(shù)據(jù)頁總分配在所謂的混合區(qū)(Mixed Extends),它大小是64kb在多個數(shù)據(jù)庫對象(像表和索引)間共享。
使用這個方法微軟保證小表保持小,因?yàn)閿?shù)據(jù)庫的第1個8頁總在混合區(qū)分配。接下來的頁(第9頁開始)在所謂的統(tǒng)一區(qū)(也是64k大小)里分配。每次你給數(shù)據(jù)庫對象分配一個統(tǒng)一區(qū),對象本身立即增長64kb。
當(dāng)你啟用SQL Server的1118跟蹤標(biāo)記,對于整個SQL Server實(shí)例,只在統(tǒng)一區(qū)分配,混合區(qū)會被忽略。使用這個方法是可以減少在SGAM(共享全局分配映射(Shared Global Allocation Map)頁,管理混合區(qū))頁上的閂鎖競爭問題(Latch Contention problem)。
在SQL Server 2016里TempDb分配總在統(tǒng)一區(qū)里發(fā)生,而不使用混合區(qū)——不需要啟用任何跟蹤標(biāo)記。除臨時表外的分配還是使用混合區(qū)。下面的例子展示了在臨時表7個分配的頁直接存儲在統(tǒng)一區(qū),而完全不使用混合區(qū)。
USE tempdb GO CREATE TABLE #HelperTable ( Col INT IDENTITY(, ) PRIMARY KEY NOT NULL, Col CHAR() NOT NULL ) GO -- Insert records, this allocates pages in tempdb INSERT INTO #HelperTable VALUES (REPLICATE('a', )) GO -- Enable DBCC trace flag DBCC TRACEON() GO -- Retrieve the temp table name from sys.tables SELECT name FROM sys.tables WHERE name LIKE '#HelperTable%' GO -- Retrieve the first data page for the specified table (columns PageFID and PagePID) DBCC IND(tempdb, [#HelperTable________________________________________________________________________________________________________B], -) GO -- Dump the IAM page of the table TestTable retrieved by DBCC IND previously -- No pages are allocated in Mixed Extents, a complete Uniform Extent is allocated. DBCC PAGE (tempdb, , , ) GO -- Clean up DROP TABLE #HelperTable GO
在過去1117跟蹤標(biāo)記和TempDb結(jié)合進(jìn)行同時自動增長操作。確保文件在同個區(qū)里同時增長非常重要。不然成比例的填充算法(proportional fill algorithm)不能發(fā)揮應(yīng)有的作用。使用SQL Server 2016,你就直接有1117跟蹤標(biāo)記的這個功能,而不需要啟用。
小結(jié)
花了很長時間后,微軟終于開始在SQL Server安裝向?qū)Ю镞M(jìn)行更好的默認(rèn)配置。根據(jù)可用CPU核心數(shù)配置TempDb是個巨大的進(jìn)步。我們來看看下個版本會提供根據(jù)實(shí)際情況能配置MAXDOP,并行開銷閾值和服務(wù)器最大內(nèi)存等等...
本文到此介紹了,感謝您的關(guān)注!
相關(guān)文章
SQL SERVER函數(shù)之深入表值函數(shù)的處理分析
本篇文章是對表值函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06sql server中批量插入與更新兩種解決方案分享(存儲過程)
對于sql 來說操作集合類型(一行一行)是比較麻煩的一件事,而一般業(yè)務(wù)邏輯復(fù)雜的系統(tǒng)或項(xiàng)目都會涉及到集合遍歷的問題,通常一些人就想到用游標(biāo),這里我列出了兩種方案,供大家參考2012-05-05SQL Server誤區(qū)30日談 第15天 CheckPoint只會將已提交的事務(wù)寫入磁盤
這個誤區(qū)是由于太多人對日志和恢復(fù)系統(tǒng)缺少全面的了解而存在已久。CheckPoint會將自上次CheckPoint以來所有在內(nèi)存中改變的頁寫回磁盤(譯者注:也就是臟頁),或是在上一個CheckPoint讀入內(nèi)存的臟頁寫入磁盤2013-01-01SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用
這篇文章主要介紹了SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03SQL Server中row_number分頁查詢的用法詳解
這篇文章主要介紹了SQL Server中row_number的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07sp_executesql 使用復(fù)雜的Unicode 表達(dá)式錯誤的解決方法
sp_executesql 使用復(fù)雜的Unicode 表達(dá)式錯誤的解決方法,需要的朋友可以參考下2012-01-01