SqlServer中tempdb的日志机制原理解析及示例分享
作者:hebedich 发布时间:2024-01-15 20:31:38
测试用例
我们分别在用户数据库(testpage),tempdb中创建相似对象t1,#t1,并在tempdb中创建创建非临时表,然后执行相应的insert脚本(用以产生日志),并记录执行时间用以比较用以比较说明tempdb”快”
Code
用户数据库testpage
use testpage
go
create table t1
(
id int identity(1,1) not null,
str1 char(8000)
)
declare @t datetime2=sysutcdatetime()
declare @i int
set @i=1
while (@i<100000)
begin
insert into t1 select @i,'aa'
select @i=@i+1
end
select [extime]=DATEDIFF(S,@t,sysutcdatetime())
tempdb
use tempdb
go
create table #t1
(
id int not null,
str1 char(8000)
)
declare @t datetime2=sysutcdatetime()
declare @i int
set @i=1
while (@i<100000)
begin
insert into #t1 select @i,'aa'
select @i=@i+1
end
select [extime]=DATEDIFF(S,@t,sysutcdatetime())
非临时表在tempdb中执行
use tempdb
go
create table t1
(
id int not null,
str1 char(8000)
)
declare @t datetime2=sysutcdatetime()
declare @i int
set @i=1
while (@i<100000)
begin
insert into t1 select @i,'aa'
select @i=@i+1
end
select [extime]=DATEDIFF(S,@t,sysutcdatetime())
由图1-1中我们可以看出,在普通表中执行一分钟的脚本,tempdb只需执行22s.而普通表在tempdb中也只需27s均大大优于普通表中执行情况.
感兴趣的朋友亦可在执行过程中观察日志相关的性能技术器的运行情况如(Log Bytes Flusged \sec 等)
由此测试我们可以看出本文开始提到的”tempdb比其他数据库快”.
实际并不是tempdb有什么魔法,而是tempdb的日志机制与其他数据库大有不同.
Tempdb的日志机制
Tempdb Simple恢复模式(重启后无需还原操作)
Tempdb使用最小化日志
Tempdb 不受系统CheckPoint影响(系统checkpoint不涉及tempdb,但人为tempdb中执行会落盘)
Tempdb 在刷入数据页到磁盘前,日志无需落盘(事务提交日志无需落盘)
"快"的原因
可以看到系统检查点自身会绕过tempdb,tempdb执行时无需日志先落盘.且会最小化日志记录(关于此一个特性我会稍候陈述)这些都极大的缓解了磁盘IO瓶颈,使得tempdb相比其他DB会快很多.
注意:虽然系统checkpoint检查点会绕过tempdb,但tempdb中人为执行checkpoint还是会起作用,大家只应测试环境中使用,正式环境中慎用!
在上面的实例中我们可以看到无论在表的类型是什么,在tempdb中速度都会有很大提升,但普通表的执行时间还是略长于临时表,这是因为普通表的的日志记录信息还是要略多于临时表的.
关于tempdb最小化日志
在堆表(heap)中 insert,update操作的的更新信息日志无需记录.
我们通过简单实例来看.
USE [tempdb]
GO
create table #nclst
(
id int identity(1,1) primary key nonclustered,---heaptable
str1 char(8000)
);
create table #clst
(
id int identity(1,1) primary key,------clustered
str1 char(8000)
);
checkpoint-----生产环境慎用!
DBCC SHRINKFILE (N'templog' , 0, TRUNCATEONLY)
GO
insert into #nclst(str1) select 'aa'
select [Current LSN],Operation,CONTEXT,[Log Record Length]
from fn_dblog(null,null) where AllocUnitId is not null
checkpoint-----生产环境慎用!
DBCC SHRINKFILE (N'templog' , 0, TRUNCATEONLY)
GO
insert into #clst(str1) select 'aa'
select [Current LSN],Operation,CONTEXT,[Log Record Length]
from fn_dblog(null,null) where AllocUnitId is not null
由图1-2中可以看出堆表中并未记录Insert中的#ncls.str1的具体信息,而聚集表中则记录相应信息
图1-2
Tempdb为何需要日志
既然tempdb每次重启都会重新建立,我们无需重做日志,但运行过程中是可能需要回滚的,这也是tempdb日志存在的原因.
Tempdb 不支持重做(Redo)但需支持回滚(rollback).
关于tempdb回滚.
Tempdb中如果日志文件中无足够空间应用回滚则会引起整个实例就宕机!
Tempdb最佳实践-日志
a 不要tempdb中checkpoint(消耗巨大引起系统性能下滑)
b 不要tempdb中开启过长事务(无法截断日志,造成日志过大,如回滚时无法回滚则宕机)
c 一般需要中间表匹配的过程在tempdb中创建进行(创建速度快,需视具体情况而定.)
d tempdb中使用堆表速度佳.(需视具体情况而定)
猜你喜欢
- 什么是模板匹配模板匹配是指在当前图像A内寻找与图像B最相似的部分,可以理解找茬,但是这里是找出一样的信息。一般我们将图像A称为输入图像,将图
- 逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后
- PS:这段时间有点不在状态,刚刚找回那个状态,那么我们继续曾经的梦想今天我们来补充一下文件的上传的几种方式:首先我们先补充的一个知识点:一、
- 函数带括号和不带括号的区别1、不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不需等该函数执行完成2、带括号(此
- PyTorch基础入门一:PyTorch基本数据类型1)Tensor(张量)Pytorch里面处理的最基本的操作对象就是Tensor(张量)
- 本文实例讲述了Python3.5面向对象编程。分享给大家供大家参考,具体如下:1、面向过程与面向对象的比较(1)面向过程编程(procedu
- 一、贝叶斯分类介绍贝叶斯分类器是一个统计分类器。它们能够预测类别所属的概率,如:一个数据对象属于某个类别的概率。贝叶斯分类器是基于贝叶斯定理
- django中form表单设置action后,点提交按钮是跳转到action页面的,比如设置action为login,网址为192.168.
- 本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下python+opencv实现高斯平滑
- MySql5.0以后均支持存储过程,最近有空,研究了一把这个。格式:以下为引用的内容:CREATE PROCEDURE
- 获取标签内容使用element.attribute()方法获取dom元素的内容,如:dr = driver.find_element_by_
- 本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下:官方文档 – https://docs.opencv
- 在做维护项目的时,我们经常会遇到索引维护的问题,通过语句,我们就可以判断某个表的索引是否需要重建。 执行一下语句:先分析表的索引 分析表的索
- Elasticsearch简介Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene&
- 通过这个布局思路来做一个简单的后台管理系统也是OK的,大家可以参考一下啦!话不多说,还是先来梳理一下需要的第三方模块。PyQ5 的UI界面布
- 安装Tornado省事点可以直接用grequests库,下面用的是tornado的异步client。 异步用到了tornado,根据官方文档
- 这几天用到了raw socket,用python写了些demo程序,这里记录下。首先我们看一个简单的sniffer程序:#! /usr/bi
- 首先下载 MySQLdb #encoding=GBK import MySQLdb #import sys # #reload(sys) #
- pycharm常用快捷键1、编辑(Editing)Ctrl + Space基本的代码完成(类、方法、属性)Ctrl + Alt + Spac
- 自动发送邮件我们把报表做出来以后一般都是需要发给别人查看,对于一些每天需要发的报表或者是需要一次发送多份的报表,这个时候可以考虑借助Pyth