锐安盾-网站安全加速服务

中国站

联系我们

400-002-9968

售前咨询

售后服务

注册 登录

博客 > SQL知识:SQL临时表定义、分类及示例

SQL知识:SQL临时表定义、分类及示例

  • 标签:
  • SQL临时表
  • 临时表
  • SQL

浏览量:1155次评论:0次

作者:锐成网络整理时间:2024-06-03 17:56:33

SQL开发中,临时表是一种非常实用的工具,可以在不影响数据库结构的情况下临时存储数据、加快查询速度、简化复杂的SQL操作。本文将深入探讨SQL临时表的定义、分类和示例

一、临时表定义

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

SQL知识:SQL临时表定义、分类及示例

二、临时表分类

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

三、临时表的特性

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

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

四、本地临时表

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

本地临时表实例

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

SQL知识:SQL临时表定义、分类及示例

Customers

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

SQL知识:SQL临时表定义、分类及示例

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

SELECT * INTO #Customers FROM Customers

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

SELECT * FROM #Customers

SQL知识:SQL临时表定义、分类及示例

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

SQL知识:SQL临时表定义、分类及示例

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

SQL知识:SQL临时表定义、分类及示例

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

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

SQL知识:SQL临时表定义、分类及示例

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

五、全局临时表

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

全局临时表实例

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

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

SELECT * INTO ##Customers FROM Customers

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

SELECT * FROM ##Customers

结果如下:

SQL知识:SQL临时表定义、分类及示例

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

全局临时表的位置如下:

SQL知识:SQL临时表定义、分类及示例

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

六、临时表的用途

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

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

SELECT * FROM sales.Temp_Salesorder
WHERE SalesOrderDetailID IN 
(SELECT SalesOrderDetailID 
FROM sales.SalesOrderDetail
WHERE UnitPrice IN
(SELECT UnitPrice 
FROM sales.SalesOrderDetail 
WHERE UnitPrice>0)
)

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

SQL知识:SQL临时表定义、分类及示例

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

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

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)

执行情况如下:

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

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

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

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

在实际的SQL开发中,合理地使用临时表可以提高查询性能、简化操作流程,是提升工作效率的利器。

重要声明:本文来自SQL数据库开发,经授权转载,版权归原作者所有,不代表锐成观点,转载的目的在于传递更多知识和信息。

我的评论

还未登录?点击登录

微信扫码沟通
微信扫码沟通

微信扫码沟通

售前咨询
合作
售后
return head