sql server 临时表(上) Tempdb概述
一.概述
在sql server里临时表存储在TempDB库中,TempDB是一个系统数据库,它只有Simple恢复模式,也是最小日志记录操作。主要用于存放局部临时表,全局临时表,表变量,都是基于临时特征,每次服务器或服务重启后,都会按照Model库的配置重新创建TempDB库。在sql server 2012中TempDB表可以配置在故障转移中。在TempDB库中存放三类对象包括:用户对象, 内部对象, 行版本存储。TempDB库只有一个文件组,就是primary文件组,增加其它文件组会提示报错。在权限方面,所有用户默认都具有访问TempDB库权限。
1.1 Tempdb 的物理属性
下表列出了 tempdb 数据和日志文件的初始配置值。 对于不同版本的 SQL Server,这些文件的大小可能略有不同。
|
文件 |
逻辑名称 |
物理名称 |
文件增长 |
|
主数据 |
tempdev |
tempdb.mdf |
按 10% 自动增长,直到磁盘已满 |
|
日志 |
templog |
templog.ldf |
以 10% 的速度自动增长到最大 2 TB |
1.2 使用Tempdb的作用
(1) 通过tempdb库可以缓存临时表和表变量,用于减少数据表的查询次数以及锁问题。缓存允许删除和创建临时对象的操作能快速地执行,并减少页分配的争用问题。
(2) 分配页闩锁协议得到改善。 从而减少使用的 UP(更新)闩锁数。
(3) 减少了 tempdb 的日志开销。 从而减少了 tempdb 日志文件上的磁盘 I/O 带宽消耗。
(4) 分配混合的页中的算法tempdb得到了改进。
1.3 使用tempdb的限制, 不能对 tempdb 数据库执行以下操作:
(1)添加文件组。
(2)备份或还原数据库。
(3)更改排序规则。 默认排序规则为服务器排序规则。
(4)更改数据库所有者。 tempdb 的所有者是 sa。
(5)创建数据库快照。
(6)删除数据库。
(7)从数据库中删除 guest 用户。
(8)启用变更数据捕获。
(9)参与数据库镜像。
(10)删除主文件组、主数据文件或日志文件。
(11)重命名数据库或主文件组。
(12)运行 DBCC CHECKALLOC。
(13)运行 DBCC CHECKCATALOG。
(14)将数据库设置为 OFFLINE。
二. TempDB存储的三类对象
在SQL 2005以后,引入了一张新的管理视图:sys.dm_db_file_space_usage。通过查询这张视图,能了解tempdb的空间使用情况,能知道tempdb的空间是被哪一块对象使用掉的,是用户对象(user_object_reserved_page_count字段),还是系统对象(internal_object_reserved_page_count字段),还是版本存储区(version_store_reserved_page_count字段。在了解这个dmv视图之前,先了解tempdb库的三类对象。
2.1 用户临时对象(user_object_reserved_page_count)
由用户会话显示创建的对象,可以在系统表目录中找到,用户临时对象主要包括以下内容:
(a) 创建临时表和索引,不过这些表在重启后清空。
(b) 全局临时表以 ##开头的表。适用于所有会话操作该表信息。需要显示的删除或重启服务才能清除表。
(c) 局部临时表以 #开头的表。适用于当前会话操作该表信息。会话结束清除表。
(d) 表变量, 以@开头。
下面是简单示例,演示局部临时表,临时表索引,全局临时表,表变量,脚本如下:
-- 创建局部临时表
CREATE TABLE #TempTable(id INT,NAME VARCHAR(10))
-- 根据已有表,创建临时表
SELECT * INTO #TempTable2 FROM tablename --创建局部临时表, 带有聚集索引
CREATE TABLE #tempWithCLUSTERED([SID] INT PRIMARY KEY CLUSTERED, model VARCHAR(50)) -- 创建全局临时表
CREATE TABLE ##TempTable3(id INT,NAME VARCHAR(10))
-- 根据已有表创建全局临时表
SELECT * INTO ##TempTable4 FROM dbo.ACT_AnswerTab -- 删除全局临时表
DROP TABLE ##TempTable4 -- 创建表变量
DECLARE @tablevar TABLE (id int,NAME varchar(10))
下面简单介绍一下,临时对象中表变量与临时表区别
(1)统计信息
表变量没有统计信息,统计信息要么为0,要么为1。sql server查询优化器只会把表变量当作里面只有1条数据或没有数据的表对待,脚本演示如下所示:
-- 创建表变量示例
DECLARE @tablevar TABLE (id int,NAME varchar(10))
INSERT INTO @tablevar(id,name)
SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY number ) AS id, number FROM master..spt_values
SELECT * FROM @tablevar

(2) 索引
表变量使用索引,只能是主键(可以是聚集和非聚集索引)或者唯一约束,需要预先定义好,定义后不能再添加索引了,注意:即使是有索引,也没有统计信息。表变量使用聚集索引如下所示:
DECLARE @tablevar TABLE (id INT PRIMARY KEY CLUSTERED,NAME varchar(10))
INSERT INTO @tablevar(id,name)
SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY number ) AS id, number FROM master..spt_values
SELECT * FROM @tablevar WHERE id=1

(3) 架构修改
架构修改可以出现在临时表上,但不会出现在表变量上面,修改会产生重编译,非预期的重编译不是好事。下面是临时表架构修改,将name字段长改为50, 脚本如下:
ALTER TABLE #TempTable ALTER COLUMN name NVARCHAR (50) NULL
USE tempdb
go
sp_help #TempTable

(4) 对比表格
|
特征 |
临时表 |
变量表 |
|
命名 |
以#开头 |
以@开头 |
|
统计信息 |
有 |
无 |
|
索引 |
有 |
仅约束可用 |
|
架构修改 |
允许 |
不允许 |
|
在sp_executesql中使用 |
可以 |
不可以 |
|
使用insert into xxx exec |
可以 |
不可以 |
|
存在于内存中 |
否 |
否 |
总结: 建议:小于100行使用表变量。数据都不是存入于内存中,而是存放在TempDB表中,通过sys.dm_db_session_space_usage这个dmv可查看空间占用情况。后面监控时再说这dmv。
2.2 内部对象(internal_object_reserved_page_count)
内部对象是根据需要 由 SQL Server 数据库引擎创建的,用于处理 SQL Server 语句。主要是查询过程中存储临时数据的对象,这些临时数据的对象可以在语句的作用域中自动创建和删除。 内部对象主要包括以下内容:
(a) 游标
(b) 哈希(Hash)联接或哈希聚合操作的查询
(c) 某些 GROUP BY、ORDER BY 或 UNION 查询的中间排序结果.
在内部对象中比较常见的是Worktable, 这个临时表是自动生成,自动销毁,主要用于游标,假脱机,临时大对象的数据类型(LOB)存储,这个内部临时表用于返回查询的中间结果,监视分析Worktable可以通过打开statistics io 选项,执行sql语句再查看,要注意的是:高效的查询下很少出现这种现象。
2.3 版本存储(version_store_reserved_page_count)
版本存储区主要用来支持Snapshot事务隔离级别,以及SQL 2005以后推出的一些其他提高数据库并发度的新功能。这类并发模式会借用TempDB来存放修改前的版本数据,第一行数据被修改前,都会在TempDB中创建一个相同的行,并加上14bytes的长度,包含: (1)修改前的事务序列号(XSN)长度为6 bytes (2) TempDB的行标识符(RID)长度为8bytes。版本存储用于存储行版本、MARS、联机索引、触发器、基于快照的隔离级别。如果开启了乐观并发模式(已提交读快照和快照二种隔离级别),可能造成Tempdb库的非预期增长, 需要对Tempdb库进行监控。
sql server 临时表(上) Tempdb概述的更多相关文章
- sql server 临时表(中) Tempdb监控
一. 监控概述 Tempdb库空间使用的一大特点,是只有一部分对象,例如用户创建的临时表.table变量等,可以用sys.allocation_units和sys.partitions这样的管理视图 ...
- SQL Server 2016里TempDb的提升
几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...
- SQL Server 临时表和表变量系列之选择篇
原文地址:https://yq.aliyun.com/articles/69187 摘要: # 摘要 通过前面的三篇系列文章,我们对临时表和表变量的概念.对比和认知误区已经有了非常全面的认识.其实,我 ...
- Oracle临时表和SQL Server临时表的不同点对比
文章来源:http://www.codesky.net/article/201109/141401.html 1.简介 Oracle数据库除了可以保存永久表外,还可以建立临时表temporary ta ...
- SQL SERVER临时表的使用
SQL SERVER临时表的使用 drop table #Tmp --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp( ID int IDENTITY (1 ...
- 如何实现SQL Server临时表的创建?
以下的文章主要是对SQL Server临时表的创建的实际操作步骤,以及在实际操作中我们要用到的实际应用代码的介绍,我在一个信誉度很好的网站找到一个关于其相关内容今天拿出来供大家分享. 创建临时表 方法 ...
- SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...
- SQL Server中的TempDB管理——TempDB基本知识(为什么需要版本存储区)
原文:SQL Server中的TempDB管理--TempDB基本知识(为什么需要版本存储区) 参考资料来自: http://blogs.msdn.com/b/sqlserverstorageengi ...
- SQL Server临时表的使用方案
文章来源:http://www.codesky.net/article/201007/145241.html 我们今天是要和大家一起讨论的是SQL Server临时表的实用大全,如果你对SQL S ...
随机推荐
- [Swift]LeetCode1019. 链表中的下一个更大节点 | Next Greater Node In Linked List
We are given a linked list with head as the first node. Let's number the nodes in the list: node_1, ...
- java热加载和热部署
JAVA热部署和热加载 联系与区别 Java热部署与热加载的联系 1.不重启服务器编译/部署项目 2.基于Java的类加载器实现 区别 部署方式 热部署在服务器运行时重新部署项目 热加载在运行时重新加 ...
- (转)浅谈Session与Cookie的区别与联系
一.Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标 ...
- sklearn的kmeans测试
由于需要海量的进行聚类,所以将 k-means 算法自我封装成一个方便利用的库,可以直接调用得到最优的 k值 和 中心点: #!/usr/bin/python3.4 # -*- coding: utf ...
- ReentrantLock 实现原理
使用 synchronize 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现. 而 ReentrantLock 就是一个普通的类,它是基于 AQS(Abstr ...
- SignalR学习笔记(一) 简单聊天室
什么是ASP.NET SignalR? ASP.NET SignalR是一个方便程序员添加实时网络通信功能的类库.所谓的实时网络通信功能(Real-time Web Functionality)就是需 ...
- asp.net core 系列 2 启动Startup类介绍
一.Startup类 ASP.NET Core 应用是一个控制台应用,它在其 Program.Main 方法中创建 Web 服务器.其中Main方法是应用的托管入口点,Main 方法调用 WebHos ...
- ES 01 - Elasticsearch入门 + 基础概念学习
目录 1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 Elasticsearch的优点 1.3 Elasticsearch的相关产品 1.4 Elasticsea ...
- [工具]PyCharm激活、注册码无效解决办法
前言 我是个 Pythoner,开发工具一直使用的 JetBrains 的 PyCharm.我师傅告诉过我:一个程序员一定要有一个用的很 6 的 IDE,你的开发效率会提高很多,很多... 我从小白的 ...
- [整理+原创]ubuntu Thunderbird Mail设置自动提醒
开机启动的设置方法 // 在终端输入 gnome-session-properties 然后添加thunderbird为启动项 方法1——自动提醒 下载插件:Thunderbird Mail客户端菜单 ...