sql 临时表的使用详解

摘要:
Sqlserver数据库中临时表的详细信息临时表在Sqlserver数据库中非常重要。下面详细介绍了SQL数据库中临时表的特性和用法,仅供参考。真正的临时表使用数据库的临时表空间,由数据库系统自动维护,因此保存了表空间。事务或会话完成后,临时表会自动清空数据。您不需要记住在数据用完后删除它。这是因为在数据库连接1关闭后,数据库连接2此时没有使用临时表##Temp的语句,因此当Sqlserver认为此时没有引用全局临时表##Temp的数据库连接时,会释放##Temp。
Sqlserver数据库中的临时表详解
 

临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考。

 

临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。

对于临时表有如下几个特点:

  • 本地临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;
  • 不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证本地临时表在数据库连接上的独立性。
  • 真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
  • 临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。

 

本地临时表

本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从 SQL Server 实例断开连接时被删除。

 

例如我们在一个数据库连接中用如下语句创建本地临时表#Temp

数据库连接1:

复制代码
CREATE TABLE #Temp
(
    id int,
    customer_name nvarchar(50),
    age int
)
复制代码

然后同时启动数据库连接2,执行查询#Temp的操作
数据库连接2:

select * from #Temp

我们来看看数据库连接2的结果是什么?
数据库连接2:

 sql 临时表的使用详解第3张

结果显示,数据库连接2找不到表#Temp。这说明#Temp这张临时表,只是对创建它的数据库连接1可见,而对于数据库连接2来说是不可见的。

 

 

全局临时表

全局临时表的名称以两个数字符号 (##) 打头,创建后对任何数据库连接都是可见的,当所有引用该表的数据库连接从 SQL Server 断开时被删除。

例如我们在一个数据库连接中用如下语句创建全局临时表##Temp,然后插入三行数据

数据库连接1:

复制代码
CREATE TABLE ##Temp
(
    id int,
    customer_name nvarchar(50),
    age int
)

INSERT INTO ##Temp VALUES(1,'老王',20),(2,'老张',30),(3,'老李',25)
复制代码

接着我们在数据库连接2中,查询##Temp的数据
数据库连接2:

select * from ##Temp

数据库连接2结果如下
数据库连接2:

sql 临时表的使用详解第6张

可以看到,数据库连接2可以成功访问到数据库连接1创建的全局临时表##Temp,但是如果我们现在关闭数据连接1,然后再执行数据库连接2的##Temp查询语句会发生什么呢?结果如下:

关闭数据库连接1,然后数据库连接2再次执行:

select * from ##Temp

sql 临时表的使用详解第7张

我们发现关闭数据库连接1后,数据库连接2就找不到全局临时表##Temp了。这是因为数据库连接1被关闭后,数据库连接2此时也没有语句正在使用临时表##Temp,所以Sqlserver认为此时已经没有数据库连接在引用全局临时表##Temp了,就将##Temp释放掉了。

 

接下来,我们尝试在数据库连接2中对全局临时表##Temp持有事务中的排他锁(X锁)后,然后关闭数据库连接1.

数据库连接1:

复制代码
CREATE TABLE ##Temp
(
    id int,
    customer_name nvarchar(50),
    age int
)

INSERT INTO ##Temp VALUES(1,'老王',20),(2,'老张',30),(3,'老李',25)
复制代码

数据库连接2:

BEGIN TRAN
select * from ##Temp with(xlock)

关闭数据库连接1,然后数据库连接2执行:

select * from ##Temp

sql 临时表的使用详解第10张

结果显示我们尽管关闭了数据库连接1,但是由于数据库连接2在事务中一直持有全局临时表##Temp的排他锁(X锁),所以临时表##Temp并没有随着数据库连接1的关闭而被释放掉,只要数据库连接2中启动的事务没有被回滚或提交,那么数据库连接2会一直持有临时表##Temp的排他锁,这时Sqlserver会认为还有数据库连接正在引用全局临时表##Temp,所以##Temp不会被释放掉。

免责声明:文章转载自《sql 临时表的使用详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.gitignore 文件设置WinMain与WndProc以及窗口诞生过程总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle 20c 新特性:原生的 JSON 数据类型(Native JSON Datatype)

墨墨导读:Oracle 在 12c(12.1.0.2)版本中引入了对JSON的支持,允许将JSON存储在数据库中的varchar2或LOB(CLOB或BLOB)中。这意味着,我们可以利用无模式设计模型所提供的灵活性来构建应用程序,但又能从Oracle数据库的强大功能中受益。 Oracle 在 12c(12.1.0.2)版本中引入了对JSON的支持,允许将...

mssql性能优化

总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了。我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开...

Docker 部署Confluence15.2

一、数据库准备 数据库版本:5.7 这里数据库并没有采用docker镜像方式,而是选择已有数据库。至于数据库安装这里不再说明。 注:我这里安装confluence时,需要在下面配置数据库信息时,在数据库地址链接后面加上?sessionVariables=tx_isolation='READ-COMMITTED',否则会报错 1) 创建数据库并授权 cre...

Oracle字段

pl/sql查看当前数据库编码语句:select userenv('language') from dual; 测试结果:数据库字符集编码是utf-8 1、nvarchar2(size) ,size不能大于2000;而varchar2(size),size不能大于4000 2、nvarchar2(size)存size个汉字、英文等;varchar2(si...

centos7下面安装zabbix

先声明一点,在容器里面创建会有文件缺失,就是创建数据库的sql文件没有了,不知道为啥,反复多次都是这样,在虚拟机上面做就不会。 一、环境准备工作。zabbix的安装需要LAMP环境1、关闭SELinux首先查看SELinux状态:方法一:输入命令 /usr/sbin/sestatus -v 结果如下方法二:直接输入命令 getenforce1)、临时关闭(...

利用NBI可视化+influxDB时序数据库构建物联网大数据分析平台

什么是时序数据库        先来介绍什么是时序数据。时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。 时序数据库就是存放时序数据的数据库,并且需要支持时序数据的快速写入、持久化、多纬度的聚合查询等基本功能。        ...