浅谈SQL Server 2016里TempDb的进步

 更新时间:2016年01月21日 09:21:38   投稿:hebedich  
tempdb:是连接到 SQL Server 实例的所有用户都可用的全局资源,它保存所有临时表,临时工作表,临时存储过程,临时存储大的类型,中间结果集,表变量和游标等。另外,它还用来满足所有其他临时存储要求.

几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0)。这个预览版相比以前的CTP包含了很多不同的提升。在这篇文章里我会谈下对于SQL Server 2016,TempDb里的显著提升。

TempDb定制

在SQL Server 2016安装期间,第一个你会碰到的改变是在安装过程中,现在你能配置TempDb的物理配置。我们可以详细看下面的截屏。

微软现在检测几个可用的CPU内核,基于这个数字安装程序自动配置TempDb文件个数。这个对克服闩锁竞争问题(Latch Contention problem)非常重要,通常当你运行TempDb时,只有一个数据文件会发生。这里安装向导使用下列公式:

当你有小于等于8个CPU内核,你会获得和你CPU内核数一样的TempDb数据文件数。如果你有超过8个CPU内核,你会得到开箱即用的8个TempDb数据文件。

我在不同的配置上测试了安装向导,下表总结了TempDb数据文件的不同个数。

CPU内核    TempDb数据文件

2        2

4        4

8        8

32        8

这是一个巨大的进步!当我进行SQL Server健康检查时,TempDb只有一个数据文件,会有一些闩锁竞争问题(Latch Contention problem)是常见的。

如果在向导里你提供多个数据路径,你可以在各个文件夹之间循环(round-robin)分配。有一点我不喜欢的是,新的配置8MB的初始大小和64MB的自动增长率。

分配和自动增长

在SQL Server 2016之前,很多人使用1117和1118跟踪标记来定义SQL Server在数据库里如何分配页,和如何在多个数据文件间处理自动增长操作。在以前的SQL Server版本里,临时表的数据页总分配在所谓的混合区(Mixed Extends),它大小是64kb在多个数据库对象(像表和索引)间共享。

使用这个方法微软保证小表保持小,因为数据库的第1个8页总在混合区分配。接下来的页(第9页开始)在所谓的统一区(也是64k大小)里分配。每次你给数据库对象分配一个统一区,对象本身立即增长64kb。

当你启用SQL Server的1118跟踪标记,对于整个SQL Server实例,只在统一区分配,混合区会被忽略。使用这个方法是可以减少在SGAM(共享全局分配映射(Shared Global Allocation Map)页,管理混合区)页上的闩锁竞争问题(Latch Contention problem)。

在SQL Server 2016里TempDb分配总在统一区里发生,而不使用混合区——不需要启用任何跟踪标记。除临时表外的分配还是使用混合区。下面的例子展示了在临时表7个分配的页直接存储在统一区,而完全不使用混合区。

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跟踪标记和TempDb结合进行同时自动增长操作。确保文件在同个区里同时增长非常重要。不然成比例的填充算法(proportional fill algorithm)不能发挥应有的作用。使用SQL Server 2016,你就直接有1117跟踪标记的这个功能,而不需要启用。

小结

花了很长时间后,微软终于开始在SQL Server安装向导里进行更好的默认配置。根据可用CPU核心数配置TempDb是个巨大的进步。我们来看看下个版本会提供根据实际情况能配置MAXDOP,并行开销阈值和服务器最大内存等等...

相关文章

  • 基于Python的SQL Server数据库实现对象同步轻量级

    基于Python的SQL Server数据库实现对象同步轻量级

    这篇文章主要介绍了基于Python的SQL Server数据库对象同步轻量级实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • sqlserver禁止management studio的自动提交事务

    sqlserver禁止management studio的自动提交事务

    默认management studio是自动提交事务,即一个语句就一个事务,那么如何禁止其自动提交呢?下面有个不错的方法,大家可以参考下
    2014-06-06
  • SQL Server 日期和时间的内部存储过程

    SQL Server 日期和时间的内部存储过程

    在SQL Server的内部存储中,日期和时间不是以字符串的形式存储的,而是使用整数来存储的。这篇文章主要介绍了SQL Server 日期和时间的内部存储,需要的朋友可以参考下
    2019-12-12
  • 使用sqlplus创建DDL和DML操作方法

    使用sqlplus创建DDL和DML操作方法

    这篇文章主要介绍了使用sqlplus创建DDL和DML操作方法,需要的朋友可以参考下
    2018-04-04
  • SQL Server快速彻底卸载实例方法分享

    SQL Server快速彻底卸载实例方法分享

    最近在安装了SQL Server后,当由于某些原因我们需要卸载它时,我们应该怎么操作呢?这篇文章主要给大家介绍了关于SQL Server快速彻底卸载的相关资料,需要的朋友可以参考下
    2023-10-10
  • SQL查询入门(上篇) 推荐收藏

    SQL查询入门(上篇) 推荐收藏

    SQL语言是一门简单易学却又功能强大的语言,它能让你快速上手并写出比较复杂的查询语句。
    2011-09-09
  • sql server 累计求和实现代码

    sql server 累计求和实现代码

    这篇文章主要介绍了sql server 累计求和的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • SQL效率提升之一些SQL编写建议并有效利用索引

    SQL效率提升之一些SQL编写建议并有效利用索引

    如何编写SQL语句也是影响索引性能的一个重要方面,下面有几点需要特别留意
    2010-04-04
  • SQL Server数据库错误829的修复办法

    SQL Server数据库错误829的修复办法

    SQL Server 错误 829 是与 SQL Server 页面相关的错误,当用户尝试自动修复主数据库中的页面,但由于某种原因而失败时,可能会发生 SQL Server 错误 829,所以本文给大家介绍了如何修复 SQL Server 数据库错误 829,需要的朋友可以参考下
    2024-08-08
  • SQLServer 中的死锁说明

    SQLServer 中的死锁说明

    死锁(deadlock)指进程之间互相永久阻塞的状态,SQL可以检测到死锁,并选择终止其中一个事务以干预死锁状态。
    2010-08-08

最新评论