--==========================================================================

在博客园看到一篇文章《SQLServer Temp tables 数据疑问》,文章中问道在没有任何负载情况下,还有大量的临时表,这是为什么?

--==========================================================================

让我们来实验探索下

首先选择任何一个用户数据库,执行以下脚本:

CREATE PROCEDURE USP_TempTableTest
AS
BEGIN
SET NOCOUNT ON; CREATE TABLE #TB1(C11 INT,C22 INT)
INSERT INTO #TB1
SELECT 1,1 SELECT * FROM #TB1
END
GO EXEC USP_TempTableTest

按照通用的理解,存储过程中的临时表会在调用中创建,在存储过程调用结束后释放,存储过程执行结束后,我们不应该在tempdb中找到#TB1开头的临时表。

让我们来检查下

use tempdb
go
--======================================
--查看临时表的列
SELECT OBJECT_NAME(OBJECT_ID) AS ObjName,
* FROM SYS.all_columns
WHERE OBJECT_NAME(OBJECT_ID) LIKE '%#%'

运行以上代码,可以很容易找到:

列名C11和C22和我们存储过程中定于的临时表列名一样,只是换了个马甲而已,别告诉我换了马甲你们就不认识”它“咯

--================================================================

解释:

上面看到的#A2206DOC这个临时表并不是我们存储过程中使用到的#TB1,但是但是两者存在一定关联。想象一下,每次存储过程执行,都需要创建和释放临时表,而创建和释放临时表又涉及到修改很多系统表的数据,而如果缓存这个临时表,那么下一次调用存储过程时,就避免创建和释放临时表所照成的资源消耗,从而达到一定的性能提升。

专业解释:

SQL Server删除一个临时对象时,不移除该对象的条目,当再次使用时,就无须重新创建临时对象,SQL Server为临时对象缓存一个数据页和一个IAM页,并回收剩余页,如果临时表的大小超过8MB,回收会异步进行。

--==================================================================

问题1: 多个存储过程并发调用的时候怎么办?

当并发调用时,会生成多个类似的临时表”缓存“以供调用,并保证一个临时表”缓存“在一个时间点内只能被一个回话执行的存储过程访问到,在访问结束后,会清理该临时表”缓存“的数据,然后供下一个回话使用。

问题2: 什么样的临时表会被”缓存“

当然不是所有临时表都会被缓存,需要满足一定的条件:

1. 没有创建命名约束

2. 临时对象在创建后没有执行影响临时表的数据定义语言DDL操作(如创建索引和创建统计)

3. 没有使用动态SQL创建临时对象

4. 临时对象被创建在另一个对象的内部,如存储过程、触发器、用户自定义函数或临时对象是一个用户自定义表值函数的分会表

--=====================================================================

依旧妹子引狼(最近小忙,不能保证妹子质量,勿怪)

TempDB--临时表的缓存的更多相关文章

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

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

  2. sql server 临时表(上) Tempdb概述

    一.概述 在sql server里临时表存储在TempDB库中,TempDB是一个系统数据库,它只有Simple恢复模式,也是最小日志记录操作.主要用于存放局部临时表,全局临时表,表变量,都是基于临时 ...

  3. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?

    本文出处:http://www.cnblogs.com/wy123/p/6704619.html 问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时 ...

  4. SQLSERVER Tempdb的作用及优化

    tempdb 系统数据库是可供连接到 SQL Server 实例的所有用户使用的全局资源.tempdb 数据库用于存储下列对象:用户对象.内部对象和版本存储区. 用户对象 用户对象由用户显式创建.这些 ...

  5. MS SQL 中判断 数据库, 存储过程,表,临时表,视图,函数,用户,用户创建对象 等是否存在 SQL脚本

    摘自: http://www.111cn.net/database/mssqlserver/39107.htm sql判断存储过程是否存在 判断数据库教程是否存在 Sql代码 if exists (s ...

  6. Oracle、SqlServer——临时表

    一.oracle 1.概述: oracle数据库的临时表的特点: 临时表默认保存在TEMP中: 表结构一直存在,直到删除:即创建一次,永久使用: 不支持主外键. 可以索引临时表和在临时表基础上建立视图 ...

  7. SqlServer性能优化 即席查询(十三)

    执行计划,查询类别: 1.即席查询     2.预定义查询 select c.EnglishProductCategoryName,p.EnglishProductName,p.Color,p.Siz ...

  8. asp.net、mvc、ajax、js、jquery、sql、EF、linq、netadvantage第三方控件知识点笔记

    很简单,如下: 父页面:(弹出提示框) function newwindow(obj) { var rtn = window.showModalDialog('NewPage.htm','','sta ...

  9. SQL Server 日常维护经典应用

    SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORT ...

  10. SQL语句全

    创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...

随机推荐

  1. Mysql两个time类型计算时间相减

    round((UNIX_TIMESTAMP(finishtime)-UNIX_TIMESTAMP(starttime))/60) 得到的时间是分钟数

  2. cdoj203-Islands 【并查集】

    http://acm.uestc.edu.cn/#/problem/show/203 Islands Time Limit: 30000/10000MS (Java/Others)     Memor ...

  3. U盘做启动盘后,恢复原始容量

    借助u盘进行系统安装时,可能会对u盘进行分区.u盘分区后,再连接至电脑,就有很大程度的可能是一部分区域不能显示.u盘原本的大小被占据,显示的大小是比之前少了的,并且这些少掉了的内存也无法再使用.只有对 ...

  4. CSS文字大小单位px、em、pt详解

    这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平时都是用p ...

  5. leetcdoe 175. Combine Two Tables

    给定两个表,一个是人,一个是地址,要求查询所有人,可以没有地址. select a.FirstName, a.LastName, b.City, b.State from Person as a le ...

  6. rapidjson使用

    Value构造 Value对象最好先声明后初始化,如果声明直接初始化可能出错. rapidjson::Value a; a = val[i]; Value传参 Value传参,最好显式使用右值,如st ...

  7. 修改UITextView光标高度

    自定义UITextView文字字体时,经常出现光标与字体的高度不匹配,可以通过下面代码修改默认的光标高度, //创建子类重写UITextView方法 - (CGRect)caretRectForPos ...

  8. 4-QT的程序打包发布(将QT5的工程项目打包成一个exe程序)

    https://blog.csdn.net/windsnow1/article/details/78004265 最近,在学习QT5的过程中,想尝试着把自己写的工程程序给打包发布出来,在任何一台win ...

  9. shell中数组基础语法

    数组的基本赋值 arr=(a b c) arr[index]=a 2.常用的两个方法 str=${arr[@]}(数组转化成字符串) len=${#arr[*]}(数组长度) 3.遍历数组的方法 #! ...

  10. Js下载文件到本地(兼容多浏览器)

    在客户端通过js下载文件,试过几种下载方式,iframe方式仅限于IE浏览器,window.open(url),location.href=url 这两种方式在chrome浏览器还会是直接打开文件而不 ...