谈谈Tempdb对SQL Server性能优化有何影响
作者:changbluesky 发布时间:2024-01-28 04:55:31
先给大家巩固tempdb的基础知识
简介:
tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象。可以简单理解tempdb是SQLServer的速写板。应用程序与数据库都可以使用tempdb作为临时的数据存储区。一个实例的所有用户都共享一个Tempdb。很明显,这样的设计不是很好。当多个应用程序的数据库部署在同一台服务器上的时候,应用程序共享tempdb,如果开发人员不注意对Tempdb的使用就会造成这些数据库相互影响从而影响应用程序。
特性:
1、 tempdb中的任何数据在系统重新启动之后都不会持久存在。因为实际上每次SQLServer启动的时候都会重新创建tempdb。这个特性就说明tempdb不需要恢复。
2、 tempdb始终设置为“simple”的恢复模式,当你尝试修改时都会报错。也就是说已提交事务的事务日志记录在每个检查点后都标记为重用。
3、 tempdb也只能有一个filegroup,不能增加更多文件组。
4、 tempdb被用来存储三种类型的对象:用户对象,内部对象、版本存储区
接下来围绕主题展示问题分析:
1.SQL Server系统数据库介绍
SQL Server有四个重要的系统级数据库:master,model,msdb,tempdb.
master:记录SQL Server系统的所有系统级信息,包括实例范围的元数据,端点,链接服务器和系统配置设置,还记录其他数据库是否存在以及这些数据问文件的位置等等.如果master不可用,数据库将不能启动.
model:用在SQL Server 实例上创建的所有数据库的模板。因为每次启动 SQL Server 时都会创建 tempdb,所以 model 数据库必须始终存在于 SQL Server 系统中。
msdb:由SQL Server 代理用来计划警报和作业。
tempdb:是连接到 SQL Server 实例的所有用户都可用的全局资源,它保存所有临时表,临时工作表,临时存储过程,临时存储大的类型,中间结果集,表变量和游标等。另外,它还用来满足所有其他临时存储要求.
2.tempdb内在运行原理
与其他SQL Server数据库不同的是,tempdb在SQL Server停掉,重启时会自动的drop,re-create. 根据model数据库会默认建立一个新的8MB(mdf file:8MB;ldf file:1MB, autogtouth设置为10%)大小recovery model为simple的tempdb数据库.
tempdb数据库建立之后,DBA可以在其他的数据库中建立数据对象,临时表,临时存储过程,表变量等会加到tempdb中.在tempdb活动很频繁时,能够自动的增长,因为是simple的recovery model,会最小化日志记录,日志也会不断的截断.
3.如何合理的优化tempdb以提高SQL Server的性能
如果SQL Server对tempdb访问不频繁,tempdb对数据库不会产生影响;相反如果访问很频繁,loading就会加重,tempdb的性能就会对整个DB产生重要的影响.优化tempdb的性能变的很重要的,尤其对于大型数据库.
注:在优化tempdb之前,请先考虑tempdb对SQL Server性能产生多大的影响,评估遇到的问题以及可行性.
3.1最小化的使用tempdb
SQL Server中很多的活动都活发生在tempdb中,所以在某种情况可以减少多对tempdb的过度使用,以提高SQL Server的整体性能.
如下有几处用到tempdb的地方:
(1)用户建立的临时表.如果能够避免不用,就尽量避免. 如果使用临时表储存大量的数据且频繁访问,考虑添加index以增加查询效率.
(2)Schedule jobs.如DBCC CHECKDB会占用系统较多的资源,较多的使用tempdb.最好在SQL Server loading比较轻的时候做.
(3)Cursors.游标会严重影响性能应当尽量避免使用.
(4)CTE(Common Table Expression).也会在tempdb中执行.
(5)SORT_INT_TEMPDB.建立index时会有此选项.
(6)Index online rebuild.
(7)临时工作表及中间结果集.如JOIN时产生的.
(8)排序的结果.
(9)AFTER and INSTEAD OF triggers.
不可能避免使用tempdb,如果有tempdb的瓶颈或issue,就该返回来考虑这些问题了.
3.2重新分配tempdb的空间大小
在SQL Server重启时会自动建立8MB大小的tempdb,自动增长默认为10%. 对于小型的数据库来说,8MB大小已经足够了.但是对于较大型的数据库来说,8MB远远不能满足SQL Server频繁活动的需要,因此会按照10%的比例增加,比如说需要1GB,则会需要较长的时间,此段时间会严重影响SQL Server的性能. 建议在SQL Server启动时设置tempdb的初始化的大小(如下图片设置为MDF:300MB,LDF:50MB),也可以通过ALTER DATABASE来实现. 这样在SQL Server在重启时tempdb就会有足够多的空间可利用,从而提高效率.
难点在于找到合理的初始化大小,在SQL Server活动频繁且tempdb不在增长时会是一个合适的值,可以设置此时的值为Initial Size;当然还会有更多的考量,此为一例.
3.3不要收缩tempdb(如没有必要)
有时候我们会注意到tempdb占用很大的空间,但是可用的空间会比较低时,会想到shrink数据库来释放磁盘空间, 此时要小心了,可能会影响到性能.
如上图所示:tempdb分配的空间为879.44MB,有45%的空间是空闲的,如果shrink掉,可以释放掉一部分磁盘空闲,但是之后SQL Server如有大量的操作时,tempdb空间不够用,又会按照10%的比例自动增长. 这样子的话,所做的shrink操作是无效的,还会增加系统的loading.
3.4 分派tempdb的文件和其他数据文件到不用的IO上
tempdb对IO的要求比较高,最好分配到高IO的磁盘上且与其他的数据文件分到不用的磁盘上,以提高读写效率.
tempdb也分成多个文件,一般会根据CPU来分,几个CPU就分几个tempdb的数据文件. 多个tempdb文件可以提高读写效率并且减少IO活动的冲突.
tempdb是SQL Server重要的一部分,以上只是对tempdb的一些了解总结,还需要进一步学习...


猜你喜欢
- 最最简单的操作import numpy as npimport matplotlib.pyplot as pltfig = plt.figu
- 前言我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,所以我们存储在数据库中的时间是UTC的时间,但是当我们做的网
- 1.官网下载:https://dev.mysql.com/downloads/找到Mysql Community Server 点击点击do
- 为什么传输几千个表的数据时向导会失败?当前的向导体系结构会创建一个 DTS 软件包数据流以传输数据。但如果要处理几千个表,则会遇到可伸缩性限
- 本文实例讲述了Python实现的网页截图功能。分享给大家供大家参考,具体如下:方法一、使用PyQt4的QtWebKit组件#!/usr/bi
- 自定义函数import requestsfrom bs4 import BeautifulSoupheaders={'User-Ag
- 摘要:下文讲述五种运行sql脚本的方法,如下所示:实验环境:sql server 2008 R2在一次会议讨论中,大家咨询我使用SSMS运行
- 在很多的情况下,在编写存储过程中往往会用到数组,但是mysql中存储过程传入参数并没有可以直接传入数组的方法。在这种情况下我们只能退而求之或
- 二维正态分布采样后,绘制置信椭圆假设二维正态分布表示为:下图为两个二维高斯分布采样后的置信椭圆和每个二维高斯分布采样100个数据点,图片为:
- python 生成 exe 文件的方法:首先安装 pyinstaller,代码为【pip install pyinstaller】;然后使用
- 前言今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练习吧,提高自己的
- 参数数量及其作用tf.layers.dense用于添加一个全连接层。函数如下:tf.layers.dense( i
- 目前,在使用python处理一个nc文件绘制一个风场图时,出现了以下报错虽然图片画出来了,但是很丑而且没有理想的填充颜色!但是不知道为啥,但
- git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另
- 本文实例为大家分享了python openCV自制绘画板的具体代码,供大家参考,具体内容如下import numpy as npimport
- 在项目中遇到需要处理超级大量的数据集,无法载入内存的问题就不用说了,单线程分批读取和处理(虽然这个处理也只是特别简单的首尾相连的操作)也会使
- 准备工作本文用到的表格内容如下:先来看一下原始情形:import pandas as pddf = pd.read_excel(r'
- 今天的这篇文章是讲XHTML中的细节部分的,这篇续述的主题就是ID与CLASS怎么用,在标题中有提及使用原则与技巧,这里的使用原则与技巧是我
- <input name="a" type="checkbox"
- Oracle的分析函数功能非常强大,工作这些年来经常用到。这次将平时经常使用到的分析函数整理出来,以备日后查看。我们拿案例来学习,这样理解起