加入收藏 | 设为首页 | 会员中心 | 我要投稿 广州站长网 (https://www.020zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL中的临时表

发布时间:2022-12-13 13:42:13 所属栏目:MsSql教程 来源:转载
导读: 点击关注上方“SQL数据库开发”,
设为“置顶或星标”,第一时间送达干货
SQL专栏
临时表定义
临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。当我们不再使用临

点击关注上方“SQL数据库开发”,

设为“置顶或星标”,第一时间送达干货

SQL专栏

临时表定义

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

临时表分类

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

临时表的特性

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

本地临时表

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

本地临时表实例

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

mssql存储过程 创建表_刀剑神域临时临时h吧_mssql 临时表

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

刀剑神域临时临时h吧_mssql存储过程 创建表_mssql 临时表

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

SELECT * INTO #Customers FROM Customers

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

SELECT *  FROM #Customers

mssql存储过程 创建表_刀剑神域临时临时h吧_mssql 临时表

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

刀剑神域临时临时h吧_mssql 临时表_mssql存储过程 创建表

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

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

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

刀剑神域临时临时h吧_mssql存储过程 创建表_mssql 临时表

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

全局临时表

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

全局临时表实例

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

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

SELECT * INTO ##Customers FROM Customers

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

SELECT * FROM ##Customers

结果如下:

mssql存储过程 创建表_刀剑神域临时临时h吧_mssql 临时表

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

全局临时表的位置如下:

刀剑神域临时临时h吧_mssql 临时表_mssql存储过程 创建表

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

临时表的用途

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

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

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

(提示:代码可以左右滑动)

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

mssql存储过程 创建表_刀剑神域临时临时h吧_mssql 临时表

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

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

注:上图的统计信息需开启SSMS相关功能,具体如下:

工具—选项—查询执行—高级

刀剑神域临时临时h吧_mssql存储过程 创建表_mssql 临时表

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)

执行情况如下:

mssql存储过程 创建表_mssql 临时表_刀剑神域临时临时h吧

mssql存储过程 创建表_mssql 临时表_刀剑神域临时临时h吧

相比上一次的逻辑读,成倍的减少了逻辑读取次数。在对查询的性能进行调节时,如果逻辑读值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。如果逻辑读值增加,则表示调节措施降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。

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

总结

临时表不管是在SQL Server还是其他平台都有使用,其在查询优化方面可以极大的提高查询效率,而SQL Server平台的临时表相比其他平台更容易创建和使用,其优越性不言而喻。所以如果平时工作或学习过程中,临时表可以作为一个必备技能经常使用。

最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。

有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行数据前线

mssql 临时表_mssql存储过程 创建表_刀剑神域临时临时h吧

后台回复关键字:1024,获取一份精心整理的技术干货

后台回复关键字:进群,带你进入高手如云的交流群。

(编辑:广州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!