前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL教程:临时表

SQL教程:临时表

作者头像
SQL数据库开发
发布2024-05-10 18:30:32
760
发布2024-05-10 18:30:32
举报
文章被收录于专栏:SQL数据库开发SQL数据库开发

SQL刷题专栏

SQL145题系列

临时表定义

临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。当我们不再使用临时表的时候,临时表会自动删除。

临时表分类

临时表分为本地临时表和全局临时表,它们在名称、可见性以及可用性上有区别。

临时表的特性

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

  • 本地临时表就是用户在创建表的时候添加了"#"前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;
  • 全局临时表是用户在创建表的时候添加"##"前缀的表,其特点是所以数据库连接均可使用该全局临时表,当所有引用该临时表的数据库连接断开后自动删除。
  • 全局临时表相比本地临时表,命名上就需要注意了,与本地临时表不同的是,全局临时表名不能重复。
  • 临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了物理表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
  • 临时表在事务完毕或会话完毕数据库会自动清空,不必记得用完后删除数据。

本地临时表

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

本地临时表实例

我们以Customers表为实例,表数据如下:

Customers

我们新建一个连接,每当“新建查询”就代表打开了一个连接,连接的ID就是sa后面的数字,我们的这个连接ID是57.

下面我们在这个查询页面建立一个临时表。

代码语言:javascript
复制
SELECT * INTO #Customers FROM Customers

这样我们就建好了一个临时表,可以查询一下临时表#Customers的数据。与Customers内容一致。

代码语言:javascript
复制
SELECT * FROM #Customers

如果我们再打开一个页面,同样查询#Customers表会怎么样呢?

我们在新开的查询页面执行上述查询语句,得到的结果如下:

说明本地临时表不支持跨连接查询。只能在当前连接(或者当前查询页面)访问。

那本地临时表具体在什么地方呢?它又是怎么存放的呢?

这就是我们刚才建立的临时表,在系统中并不是用#Cusomters这样的表名来表示的。

全局临时表

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

全局临时表实例

我们还是按照上面的步骤走一遍

先打开一个查询页面,输入如下查询语句:

代码语言:javascript
复制
SELECT * INTO ##Customers FROM Customers

执行完上面的查询语句后,我们关掉查询页面,再重新开一个页面查询##Customers中的内容

代码语言:javascript
复制
SELECT * FROM ##Customers

结果如下:

此时并不会像本地临时表那样报错了。

全局临时表的位置如下:

它的名称与我们自定义的名称一致,系统不会额外添加其他信息。

临时表的用途

介绍完临时表,我们来说说如何用它来进行优化

临时表的优化一般使用在子查询较多的情况下,也称为嵌套查询。我们写如下子查询:

代码语言:javascript
复制
SELECT * FROM sales.Temp_Salesorder
WHERE SalesOrderDetailID IN 
(SELECT SalesOrderDetailID 
FROM sales.SalesOrderDetail
WHERE UnitPrice IN
(SELECT UnitPrice 
FROM sales.SalesOrderDetail 
WHERE UnitPrice>0)
)

这是一个比较简单的两层嵌套子查询,我们看一下执行情况:

可以看到这里的逻辑读取是比较高的。

我们用临时表重新来看下执行情况如何,我们将第一二层的查询结果插入到#temp中,然后从临时表中查询结果。

代码语言:javascript
复制
SELECT SalesOrderDetailID INTO #temp 
FROM sales.SalesOrderDetail
WHERE UnitPrice IN 
(SELECT UnitPrice 
FROM sales.SalesOrderDetail 
WHERE UnitPrice>0)

SELECT * FROM sales.Temp_Salesorder
WHERE SalesOrderDetailID IN 
(SELECT SalesOrderDetailID FROM #temp)

执行情况如下:

相比上一次的逻辑读,成倍的减少了逻辑读取次数。

在对查询的性能进行调节时,如果逻辑读值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。

如果逻辑读值增加,则表示调节措施降低了查询的性能。

在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。

因此我们可以看出临时表在比较复杂的嵌套查询中是可以提高查询效率的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL数据库开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档