【1】tempdb介绍

tempdb全局存储内部对象,用户对象,临时表,临时对象,以及SQL Server操作创建的存储过程。每个数据库实例只有一个tempdb,所以可能存在性能以及磁盘空间瓶颈。

各种形式的可用空间及过度饿DDL/DML操作都会导致tempdb负载过重。这会导致运行在服务器上不相干程序运行缓慢或者运行失败。

  tempdb的一些常见通病如下:

  --耗完了tempdb的所有存储空间

  --读取tempdb时的I/O瓶颈造成的查询运行缓慢。

  --过度的DDL操作造成在系统表上的瓶颈。

  --分配竞争

  在我们开始诊断问题之前,让我们首先看一下tempdb的空间都用在了哪些地方。可以分成四个主要的类比:

类别 描述
用户对象

这些是明确地由用户创建并且在系统类别中进行追踪。他们包括下面的:
--表及索引
--全局性质的临时表(##t1)以及索引
--局部临时表(#t1)及索引
  会话范围的
  存储过程范围的
--表变量(@t1)
  会话范围的
  存储过程范围的

内部对象 SQL Server在运行查询的时候会创建或销毁许多语句范围的对象。这些
没有在系统类别中被追踪。他们包括以下内容:
--工作文件(hash连接)
--排序运行
--工作表(游标,池以及临时的大对象数据类型(LOB)存储)
--这里有两种情况除外:临时的大对象存储是批处理范围的,另一是游标工作表是会话范围的
版本存储 这个被用来存储行版本。MARS,在线索引,触发器,以及快照隔离级别都是基于行版本的。
空闲空间 这个显示出了可用于tempdb的磁盘空间

  总的tempdb空间=用户对象+内部对象+存储的版本信息+空闲空间。

  这个空闲空间大小跟tempdb性能计数器上空闲空间是一样的。

监测tempdb空间

  提前避免问题的发生总是比出现问题之后再去解决要好的多。你可以使用Free Space in tempdb(kb)性能计数器去监测正在使用的tempdb空间数量。这个计数器以kb为单位追踪空闲空间。管理员可以使用这个计数器去判断tempdb是否因为空闲空间倒置运行缓慢。

  然而,明确前面提到的四种类别如何使用tempdb磁盘空间的,就显得更有趣也更有效。

  下面的查询语句返回用户及内部对象使用的tempdb空间。

  

--查看tempdb的空间使用分布情况
select SUM(user_object_reserved_page_count)*8 as user_objects_kb,
SUM(internal_object_reserved_page_count)*8 as internal_objects_kb,
SUM(version_store_reserved_page_count)*8 as version_store_kb,
SUM(unallocated_extent_page_count)*8 as freespace_kb
from sys.dm_db_file_space_usage where database_id=2
--查看数据库初始大小,现在大小,初始与现在的大小差
USE db_tank;
WITH cte
AS (
SELECT DB_NAME(database_id) AS name,
mf.name AS db_filename,
mf.physical_name,
CAST((mf.size / 128.0) AS DECIMAL(20, 2)) AS initial_size_MB,
CAST((df.size / 128.0) AS DECIMAL(20, 2)) AS actual_size_MB,
CASE mf.is_percent_growth
WHEN 0 THEN STR(CAST((mf.growth / 128.0) AS DECIMAL(10, 2))) + ' MB'
WHEN 1 THEN STR(mf.growth) + '%'
END AS auto_grow_setting
FROM sys.master_files mf
JOIN sys.database_files df ON mf.name = df.name
WHERE mf.database_id = DB_ID()
)
SELECT *,
actual_size_MB - initial_size_MB AS change_in_MB_since_restart
FROM cte;
 
 

【2】如何在SQL Server中优化Tempdb

注意tempdb似乎很明显。但是怎么样?我总结了一些规则:

1.每次重新启动后都会重建tempdb,从而为tempdb提供足够大的初始大小。

参考:调整TEMPDB文件大小

USE [master]
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 64MB, FILEGROWTH = 64MB )
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', SIZE = 64MB, FILEGROWTH = 64MB )
GO

参考:SQL Server TempDB初始化大小是如何决定的

2.由于经常访问tempdb并将tempdb外包给另一个驱动器是加速访问的一个很好的措施。

  用于移动tempdb文件的脚本。

--check the file path
select *from master.sys.master_files where database_id=2 ALTER DATABASE tempdb modify file
(NAME =tempdev,FILENAME ='D:\dandantang\systemdb\tempdb.mdf'); ALTER DATABASE tempdb modify file
(NAME = templog,FILENAME ='D:\dandantang\systemdb\templog.ldf'); --然后重启引起服务即可

最佳实践(迁移到用户数据库相同目录下去)

use tempdb
go
dbcc shrinkfile('tempdev',1000);
dbcc shrinkfile('templog',1000);
use db_tank;
declare @path Nvarchar(500),@path_mdf Nvarchar(500),@path_ldf Nvarchar(500),@sql nvarchar(4000);
select @path=physical_name from sys.database_files where type_desc='rows';
set @path=CAST(left(@path,len(@path)-charindex('\',reverse(@path))+1) AS NVARCHAR);
set @path_mdf=@path+N'tempdb.mdf';
set @path_ldf=@path+N'templog.ldf';
print @path+','+@path_mdf+','+@path_ldf
set @sql='
alter database tempdb modify file( name =''tempdev'',filename='''+@path_mdf+''',filegrowth=128MB);
alter database tempdb modify file( name =''templog'',filename='''+@path_ldf+''',filegrowth=128MB);
'
exec(@sql)

3.  始终为tempdb提供足够的容量。让它自动增长。

 在1中已经操作过。 参考:SQL Server TempDB初始化大小是如何决定的

4.将恢复模式设置为“简单”。并非所有内容都记录在事务日志中,这意味着当事务完成时它将从事务日志中删除。因此,日志文件不会继续不必要地增长。

alter database tempdb set recovery simple;

5.可以优化创建附加数据文件以访问数据载体,因为可以避免这种存储冲突。有一个pi *拇指规则:CPU数量等于文件数量。这改善了对数据载体的访问。

  不建议CPU数量等于文件数量,多几个即可,但强烈建议开启7中的文件分配,且应该和1中的大小一致

USE [master]
GO
ALTER DATABASE [tempdb] ADD FILE (
NAME = N'tempdev_1',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\OLAP\Data\MSSQL.1\MSSQL\DATA\tempdev_1.ndf' ,
SIZE = 8192KB ,
FILEGROWTH = 20480KB
) to filegroup primary
GO
-- 参考:文件组与文件操作

6.如果您使用多个指定相同文件大小的文件。这有利于文件的比例填充。

--1117 开启该跟踪标记; 最佳实践 DBCC TRACEON(2203,1117,-1)  
--释义:同一个文件组内的多个文件插入数据的时候会同时增长,而不是只增长第一个数据文件
(参考:跟踪标记

7.禁用自动更新以提高SQL数据库中临时数据的性能。

--这个操作一般不要做,很影响性能
USE [master]
GO
ALTER DATABASE [DB_Mart] SET AUTO_UPDATE_STATISTICS OFF WITH NO_WAIT
GO
ALTER DATABASE [DB_Mart] SET AUTO_UPDATE_STATISTICS OFF
GO

8.开启IFI(即时文件初始化)

  详情参考:即时文件初始化(IFI)

参考文件

tempdb无法收缩:https://www.cnblogs.com/gered/p/12175290.html

【基本优化实践】【1.4】tempdb优化的更多相关文章

  1. 数据库优化实践【MS SQL优化开篇】

    数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...

  2. [置顶] 数据库优化实践【MS SQL优化开篇】

    数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...

  3. Tomcat8史上最全优化实践

    Tomcat8史上最全优化实践 1.Tomcat8优化 1.1.Tomcat配置优化 1.1.1.部署安装tomcat8 1.1.2 禁用AJP连接 1.1.3.执行器(线程池) 1.1.4 3种运行 ...

  4. Hadoop YARN:调度性能优化实践(转)

    https://tech.meituan.com/2019/08/01/hadoop-yarn-scheduling-performance-optimization-practice.html 文章 ...

  5. MYSQL join 优化 --JOIN优化实践之快速匹配

    MySQL的JOIN(四):JOIN优化实践之快速匹配 优化原则:小表驱动大表,被驱动表建立索引有效,驱动表建立索引基本无效果.A left join B :A是驱动表,B是被驱动表:A right ...

  6. CDN HTTPS安全加速基本概念、解决方案及优化实践

    大家都知道,HTTP 本身是明文传输的,没有经过任何安全处理,网站HTTPS解决方案通过在HTTP协议之上引入证书服务,完美解决网站的安全问题.本文将为大家介绍阿里云CDN HTTPS安全加速传输的基 ...

  7. 直播推流端弱网优化策略 | 直播 SDK 性能优化实践

    弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

  8. 手游录屏直播技术详解 | 直播 SDK 性能优化实践

    在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

  9. 携程App的网络性能优化实践

    首先介绍一下携程App的网络服务架构.由于携程业务众多,开发资源导致无法全部使用Native来实现业务逻辑,因此有相当一部分频道基于Hybrid实现.网络通讯属于基础&业务框架层中基础设施的一 ...

  10. Glow Android 优化实践

    了解 Glow 的朋友应该知道,我们主营四款 App,分别是Eve.Glow.Nuture和Baby.作为创业公司,我们的四款 App 都处于高速开发中,平均每个 Android App 由两人负责开 ...

随机推荐

  1. chromedriver.exe,自动化web, 安装谷歌驱动,以及可能遇到的坑

    1.下载谷歌驱动:chromedriver.exe http://chromedriver.storage.googleapis.com/index.html (下载驱动的链接) 2.把下载的chro ...

  2. wx小程序知识点(八)

    八.小程序的优劣势 优势:   ① 不需要下载 ② 打开速度快 ③ 开发成本低 ④ 安卓上可以添加在桌面,与原生 App 相似 ⑤ 小程序的发布审查流程比较严格,安全保障 劣势:   ① 页面大小不能 ...

  3. ASP.NET上传断点续传

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  4. pgadmin4 csrf错误导致docker-compose postgres服务下线

    docker-compse up 启动的前台服务, 过一会就自动停止 检查半天,发现是pgadmin4没安装正确不断报400 和 csrf error 然后pgadmin4为啥报这个, 因为pytho ...

  5. UVA 10900 So do you want to be a 2^n-aire?

    #include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...

  6. 整合spring之后,struts2里面的自定义拦截器的invocation.invoke()总是返回input

    这个真的是整死我了,还好看见了一篇博客提示了我, 解决方法: 在spring的bean配置中我没有设置action的作用域为prototype,也就是多例的,如果不设置则就会是默认的singleton ...

  7. D4上午

    概率和期望DP 概率 某个事件A发生的可能性的大小,称之为事件A的概率,记作P(A). 假设某事的所有可能结果有n种,每种结果都是等概率,事件A涵盖其中的m种,那么P(A)=m/n. 例如投掷一枚骰子 ...

  8. 使用同步上下文进行C#与VBA代码和Excel之间的交互

    原始出处:www.cnblogs.com/Charltsing/p/RunVBA.html 大家都知道,Excel是个STA,不允许在Excel忙的时候对其Com对象进行操作,也不允许同时有多个线程对 ...

  9. MySQL查看数据表的创建时间和最后修改时间

    如何MySQL中一个数据表的创建时间和最后修改时间呢? 可以通过查询information_schema.TABLES 表得到信息. 例如 mysql> SELECT * FROM `infor ...

  10. sql四种连接方式

    1.内连接(inner  join)只有两个表相匹配的行才能在结果集中显示出来2.左连接(left  join)以左表为主,左表所有的数据都会在结果集中出现,右表根据左表对应的数据显示,与左表匹配的数 ...