Sql Server tempdb原理-缓存机制解析实践

Tempdb就像Sqlserver的临时仓库,各式各样的对象,数据在里面进行频繁计算,操作.大量的操作使得tempdb可能面临很大压力,tempdb中缓存的设计就是为了缓解这些压力.这次就为大家介绍下tempdb的缓存机制.

在介绍缓存机制前,先简单了解一下TempDB对象

一般我们把tempdb对象分为两种类型用户对象和内部对象.用户对象指通过显式T-sql来创造的对象(如临时表),内部对象指通过隐式T-sql创建的对象(Worktables)

注:在引入版本控制后,也可以此单独分类(DMV sys.dm_db_file_space_usage中单独列出)

用户对象

临时表

表变量(包含表值函数返回值及表值参数)

临时存储过程

用户自定义对象

用户在线(Online)创建索引空间

内部对象

Sorts(排序溢出)

Worktables(checkdb,游标,Merge joins,假脱机,并行查询交换溢出,LOB对象等)

Workfiles(hash join 溢出)

Version store(版本行控制)

查看对象使用情况

当tempdb数据文件很大或者有异常时,我们可以查看相应的使用情况.如何查看,沄剑的Blog如何查看某个查询用了多少TempDB空间有详细脚本.

Tempdb缓存机制

Tempdb中的众多对象缓存机制不尽相同,其中一些操作(如Sort)采用内部的机制,对用户是不可控的,这里我们主要介绍常用对象临时表/表变量(也是经常引发问题)的缓存机制.

临时表缓存机制(#t)

只有使用存储过程,触发器,Functions才能缓存

以plan cache的形式缓存一个IAM页和一个DatePage页

禁止Create后使用DDL操作

禁止命名约束

可以看出临时表的缓存是以proc执行计划缓存的形式实现的.所以batch,动态sql是无法缓存的.值得注意的是既然是执行计划缓存,我们就不能在proc中加WITH RECOMPILE关键字.

注意:缓存对象时局部临时表,不包括全局临时表.

我们通过一个简单的实例来分析下缓存实现.

首先我们来看下一般batch的操作(非缓存)执行两次,观察日志情况如图1-1

batch create code

use tempdb
go
checkpoint
go
create table #t
(
id int
)
insert into #t select 1
drop table #t
select Operation,CONTEXT,[Transaction ID],AllocUnitId,AllocUnitName,[Page ID],[Transaction Name],Description from fn_dblog(null,null)

图1-1

实际上我们可以看出第一次和第二次执行的日志记录情况是相同的.

再来看下proc方式

proc code

use tempdb
go
checkpoint
go

create proc p_tstcache
as
create table #t
(
id int
)
insert into #t select 1

exec p_tstcache------第一次执行后观察日志记录如图1-2

select Operation,CONTEXT,[Transaction ID],AllocUnitId,AllocUnitName,[Page ID],[Transaction Name],Description from fn_dblog(null,null)

checkpoint
go
exec p_tstcache------第二次执行后观察日志记录信息如图1-3

select Operation,CONTEXT,[Transaction ID],AllocUnitId,AllocUnitName,[Page ID],[Transaction Name],Description from fn_dblog(null,null)

图1-2

图1-3

可以看到当存储过程第二次执行时使用了缓存,日志记录数明显减少.使用完成后继续缓存。

缓存的益处

我们通过一个简单的压力测试来看下缓存的效果.

我们使用sqlquerystress开100的threads分别执行1000次看下batch,proc,proc中create后ddl的效果.(感兴趣的朋友可以观察相应的计数器 temp tables creation rate) 图1-4

注意:预先设定好tempdb数据日志文件大小,避免因为文件增长带来的测试偏差.

Code 1 batch

create table #t
(id int)Drop table #t

Code2 proc

Create proc p_tstcache
As
create table #t
(id int)

Code 3 proc ddl after create script

create proc p_tstcache_ddl
as
create table #t
(id int)
Create index ix_id on #t(id) ----ddl after create

图1-4

可以看到因为缓存机制,在一些应用频繁创建临时表的实例中我们可以通过proc中完成临时表的构建从而缓解竞争.但应注意proc 临时表cache的限制.

关于表变量.

表变量的缓存机制与临时表相同(注: 表值参数不支持缓存)

表变量是不能创建索引的,但可以有个默认约束

表变量没有统计信息

表变量不支持事务

关于Proc中显式drop临时表.

微软声称proc中显式drop临时表并不受create后DDL的影响,但在现实生产环境中的情况,显式drop还是有一定影响的.况且proc执行完成后字自动缓存处理,没必要显式drop.

关于临时表/表变量缓存应用

通过上面的实例我们可以看到,如果要利用proc缓存cache是有不少限制的.现实生产环境中我们有可能使用到临时表(表变量)需要创建索引以提高查询效率.这时就需要我们来权衡.实际上高并发查询中使用数据量较大的临时表此时我们可以在创建临时表的脚本中一并完成索引的创建.但高并发的大临时表下的压力会是创建过程吗?

结语:有时候DBA的工作的确是手艺活,需要不停的打磨权衡.在业务稳定的情形下如果我们无法调整硬件环境,就需要我们打造业务所需的合理平衡.

时间: 2024-08-02 10:13:43

Sql Server tempdb原理-缓存机制解析实践的相关文章

Sql Server Tempdb原理-日志机制解析实践

笔者曾经在面试DBA时的一句”tempdb为什么比其他数据库快?”使得95%以上的应试者都一脸茫然.Tempdb作为Sqlserver的重要特征,一直以来大家对它可能即熟悉又陌生.熟悉是我们时时刻刻都在用,陌生可能是很少有人关注它的运行机制.这次我将通过实例给大家介绍下tempdb的日志机制. 测试用例 我们分别在用户数据库(testpage),tempdb中创建相似对象t1,#t1,并在tempdb中创建创建非临时表,然后执行相应的insert脚本(用以产生日志),并记录执行时间用以比较用以比

Sql Server tempdb原理-启动过程解析实践

我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏我们该怎么办,这里我将通过实例给大家介绍. 有时tempdb因为一些原因会变得非常巨大,一些DBA的解决方式就是重启数据库实例,的确重启后tempdb就会恢复到初始设置大小,理由很简单tempdb会重新创建. Tempdb的创建过程. 1在model库打开后进行tempdb创建(可以日志中看到mod

SQL Server 最小化日志操作解析,应用

Sql Server 中数据库在BULK_LOGGED/SIMPLE模式下的一些操作会采用最小化日志的记录方式,以减小tran log落盘日志量从而提高整体性能. 这里我简单介绍下哪些操作在什么样的情况下会最小化日志记录.以及现实生产环境中如何应用最小化日志. 概念:SQL Server在满足相应条件的基础上时进行一些特定的操作如Rebuild Index时会进行最小化Tran Log记录操作,从而改善系统性能. 注意:含最小化操作日志操作段日志无法按时间点恢复(point in time) 需

SQL Server tempdb 数据库位置迁移

SQL Server tempdb 数据库位置迁移 --查看物理位置 SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('tempdb'); --修改路径 ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'D:\DataBaseNew\tempdb.mdf'); ALTER DATABASE tempdb MODIFY F

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要. 目录 概述 基础概念 怎样缓存执行计划 SQL Server自动删除执行计划 重新编译执行计划 测试 执行计划相关系统视图 手动清空缓存执行计划 测试索引更改对执

SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>

一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都表示为数字,所以处理起来速度最快,遗憾的是,它并不总是如人们所想象,在WHERE子句中进行比较时,使用该选项会造成严重的混乱. 字典顺序:这种排序方式与在字典中看到的排序方式一样,但是少有不同,可以设置大量不同的额外选项来决定是否区分大小写.音调和字符集. 1.平衡树(B-树) 平衡树或B-树仅是提供了一种以

SQL Server 锁的排队机制

1.新建一个表,插入1010000数据: create table test(id int identity(1,1) ,name varchar(600)) go insert into test values(replicate('a',600)); go 1010000 create index idx_test_id on test(id) 2.新开一个会话(A),运行如下语句,由于没有提交,所以会阻塞其他药修改相同数据的会话: begin tran update test set na

深入解析SQL Server并行执行原理及实践(上)

在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而PostgreSQL在2015实现了并行扫描,相信他们也在朝着更健壮的企业级数据库迈进.RDBMS中并行执行的实现方式大抵相同,本文将通过SQL Server为大家详细解析SQL Server并行执行的原理及一些实践. 准备知识 硬件环境-在深入并行原理前,我们需要一些准备知识,用以后面理解并行.首先是当下的硬件

SQL Server 内存数据库原理解析

前言 关系型数据库发展至今,细节上以做足文章,在寻求自身突破发展的过程中,内存与分布式数据库是当下最流行的主题,这与性能及扩展性在大数据时代的需求交相辉映.SQL Server作为传统的数据库也在最新发布版本SQL Server 2014中提供了新利器 SQL Server In-Memory OLTP(Hekaton),使得其在OLTP系统中的性能有了几十倍甚至上百倍的性能提升,本篇文章为大家探究一二. 大数据时代的数据如何组织应用?这恐怕众口不一.但不可否认,关系型数据依旧是当下世界最有效的