淺談SQL Server 2016里TempDb的進(jìn)步
幾個(gè)星期前,SQL Server 2016的最新CTP版本已經(jīng)發(fā)布了:CTP 2.4(目前已經(jīng)是CTP 3.0)。這個(gè)預(yù)覽版相比以前的CTP包含了很多不同的提升。在這篇文章里我會(huì)談下對(duì)于SQL Server 2016,TempDb里的顯著提升。
TempDb定制
在SQL Server 2016安裝期間,第一個(gè)你會(huì)碰到的改變是在安裝過程中,現(xiàn)在你能配置TempDb的物理配置。我們可以詳細(xì)看下面的截屏。

微軟現(xiàn)在檢測(cè)幾個(gè)可用的CPU內(nèi)核,基于這個(gè)數(shù)字安裝程序自動(dòng)配置TempDb文件個(gè)數(shù)。這個(gè)對(duì)克服閂鎖競(jìng)爭(zhēng)問題(Latch Contention problem)非常重要,通常當(dāng)你運(yùn)行TempDb時(shí),只有一個(gè)數(shù)據(jù)文件會(huì)發(fā)生。這里安裝向?qū)褂孟铝泄剑?/p>
當(dāng)你有小于等于8個(gè)CPU內(nèi)核,你會(huì)獲得和你CPU內(nèi)核數(shù)一樣的TempDb數(shù)據(jù)文件數(shù)。如果你有超過8個(gè)CPU內(nèi)核,你會(huì)得到開箱即用的8個(gè)TempDb數(shù)據(jù)文件。
我在不同的配置上測(cè)試了安裝向?qū)В卤砜偨Y(jié)了TempDb數(shù)據(jù)文件的不同個(gè)數(shù)。
CPU內(nèi)核 TempDb數(shù)據(jù)文件
2 2
4 4
8 8
32 8
這是一個(gè)巨大的進(jìn)步!當(dāng)我進(jìn)行SQL Server健康檢查時(shí),TempDb只有一個(gè)數(shù)據(jù)文件,會(huì)有一些閂鎖競(jìng)爭(zhēng)問題(Latch Contention problem)是常見的。
如果在向?qū)Ю锬闾峁┒鄠€(gè)數(shù)據(jù)路徑,你可以在各個(gè)文件夾之間循環(huán)(round-robin)分配。有一點(diǎn)我不喜歡的是,新的配置8MB的初始大小和64MB的自動(dòng)增長(zhǎng)率。
分配和自動(dòng)增長(zhǎng)
在SQL Server 2016之前,很多人使用1117和1118跟蹤標(biāo)記來定義SQL Server在數(shù)據(jù)庫里如何分配頁,和如何在多個(gè)數(shù)據(jù)文件間處理自動(dòng)增長(zhǎng)操作。在以前的SQL Server版本里,臨時(shí)表的數(shù)據(jù)頁總分配在所謂的混合區(qū)(Mixed Extends),它大小是64kb在多個(gè)數(shù)據(jù)庫對(duì)象(像表和索引)間共享。
使用這個(gè)方法微軟保證小表保持小,因?yàn)閿?shù)據(jù)庫的第1個(gè)8頁總在混合區(qū)分配。接下來的頁(第9頁開始)在所謂的統(tǒng)一區(qū)(也是64k大?。├锓峙?。每次你給數(shù)據(jù)庫對(duì)象分配一個(gè)統(tǒng)一區(qū),對(duì)象本身立即增長(zhǎng)64kb。
當(dāng)你啟用SQL Server的1118跟蹤標(biāo)記,對(duì)于整個(gè)SQL Server實(shí)例,只在統(tǒng)一區(qū)分配,混合區(qū)會(huì)被忽略。使用這個(gè)方法是可以減少在SGAM(共享全局分配映射(Shared Global Allocation Map)頁,管理混合區(qū))頁上的閂鎖競(jìng)爭(zhēng)問題(Latch Contention problem)。
在SQL Server 2016里TempDb分配總在統(tǒng)一區(qū)里發(fā)生,而不使用混合區(qū)——不需要啟用任何跟蹤標(biāo)記。除臨時(shí)表外的分配還是使用混合區(qū)。下面的例子展示了在臨時(shí)表7個(gè)分配的頁直接存儲(chǔ)在統(tǒng)一區(qū),而完全不使用混合區(qū)。
USE tempdb
GO
CREATE TABLE #HelperTable
(
Col1 INT IDENTITY(1, 1) PRIMARY KEY NOT NULL,
Col2 CHAR(8000) NOT NULL
)
GO
-- Insert 7 records, this allocates 7 pages in tempdb
INSERT INTO #HelperTable VALUES (REPLICATE('a', 8000))
GO 7
-- Enable DBCC trace flag 3604
DBCC TRACEON(3604)
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________________________________________________________________________________________________________00000000000B], -1)
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, 5, 33, 3)
GO
-- Clean up
DROP TABLE #HelperTable
GO
在過去1117跟蹤標(biāo)記和TempDb結(jié)合進(jìn)行同時(shí)自動(dòng)增長(zhǎng)操作。確保文件在同個(gè)區(qū)里同時(shí)增長(zhǎng)非常重要。不然成比例的填充算法(proportional fill algorithm)不能發(fā)揮應(yīng)有的作用。使用SQL Server 2016,你就直接有1117跟蹤標(biāo)記的這個(gè)功能,而不需要啟用。
小結(jié)
花了很長(zhǎng)時(shí)間后,微軟終于開始在SQL Server安裝向?qū)Ю镞M(jìn)行更好的默認(rèn)配置。根據(jù)可用CPU核心數(shù)配置TempDb是個(gè)巨大的進(jìn)步。我們來看看下個(gè)版本會(huì)提供根據(jù)實(shí)際情況能配置MAXDOP,并行開銷閾值和服務(wù)器最大內(nèi)存等等...
相關(guān)文章
基于Python的SQL Server數(shù)據(jù)庫實(shí)現(xiàn)對(duì)象同步輕量級(jí)
這篇文章主要介紹了基于Python的SQL Server數(shù)據(jù)庫對(duì)象同步輕量級(jí)實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
sqlserver禁止management studio的自動(dòng)提交事務(wù)
默認(rèn)management studio是自動(dòng)提交事務(wù),即一個(gè)語句就一個(gè)事務(wù),那么如何禁止其自動(dòng)提交呢?下面有個(gè)不錯(cuò)的方法,大家可以參考下2014-06-06
SQL Server 日期和時(shí)間的內(nèi)部存儲(chǔ)過程
在SQL Server的內(nèi)部存儲(chǔ)中,日期和時(shí)間不是以字符串的形式存儲(chǔ)的,而是使用整數(shù)來存儲(chǔ)的。這篇文章主要介紹了SQL Server 日期和時(shí)間的內(nèi)部存儲(chǔ),需要的朋友可以參考下2019-12-12
使用sqlplus創(chuàng)建DDL和DML操作方法
這篇文章主要介紹了使用sqlplus創(chuàng)建DDL和DML操作方法,需要的朋友可以參考下2018-04-04
sql?server?累計(jì)求和實(shí)現(xiàn)代碼
這篇文章主要介紹了sql?server?累計(jì)求和的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
SQL Server數(shù)據(jù)庫錯(cuò)誤829的修復(fù)辦法
SQL Server 錯(cuò)誤 829 是與 SQL Server 頁面相關(guān)的錯(cuò)誤,當(dāng)用戶嘗試自動(dòng)修復(fù)主數(shù)據(jù)庫中的頁面,但由于某種原因而失敗時(shí),可能會(huì)發(fā)生 SQL Server 錯(cuò)誤 829,所以本文給大家介紹了如何修復(fù) SQL Server 數(shù)據(jù)庫錯(cuò)誤 829,需要的朋友可以參考下2024-08-08

