SQL学习:SQL临时表的作用及用法,一文读懂临时表的用法
作者 | 幸福it民工
来源 | 今日头条
在数据库开发中,经常会用到临时表,以下内容给大家讲解临时表的具体用法:
1.1 临时表定义
临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。
当我们不再使用临时表的时候,临时表会自动删除。
1.2 临时表分类
临时表分为本地临时表和全局临时表,它们在名称、可见性以及可用性上有区别。
1.3 临时表的特性
对于临时表有如下几个特点:
本地临时表
就是用户在创建表的时候添加了"#"前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;不同的数据库连接中,创建的本地临时表虽然"名字"相同,但是这些表之间相互不存在任何关系;在 SQLSERVER 中,通过特别的命名机制保证本地临时表在数据库连接上的独立性,意思是你可以在不同的连接里使用相同的本地临时表名称。
全局临时表
是用户在创建表的时候添加"##"前缀的表,其特点是所以数据库连接均可使用该全局临时表,当所有引用该临时表的数据库连接断开后自动删除。
全局临时表相比本地临时表,命名上就需要注意了,与本地临时表不同的是,全局临时表名不能重复。临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了物理空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的 I/O 次数多,因此也提高了系统的效率。临时表在事务完毕或会话完毕后数据库会自动清空,不必记得用完后删除数据。
1.4 本地临时表
本地临时表的名称以单个数字符号"#" 打头;它们仅对当前的用户连接(也就是创建建本地临时表的 connection)是可见的;当用户从 SQL Server 实例断开连接时被删除。
1.5 本地临时表实例
我们以 Customers 表为实例,具体数据如下:
如果我们再打开一个页面,同样查询#Customers 表会怎么样呢?
我们在新开的查询页面执行上述查询语句,得到的结果如下:
说明本地临时表不支持跨连接查询。只能在当前连接(或者当前查询页面)访问。
说明本地临时表不支持跨连接查询。只能在当前连接(或者当前查询页面)访问,那本地临时表具体在什么地方呢?它又是怎么存放的呢?
这就是我们刚才建立的临时表,在系统中并不是用#Cusomters 表示的。
1.6 全局临时表
全局临时表的名称以两个数字符号 "##"打头,创建后对任何数据库连接都是可见
的,当所有引用该表的数据库连接从 SQL Server 断开时被删除。
1.7 全局临时表实例
我们还是按照上面的步骤走一遍吧:先打开一个查询页面,输入如下查询语句:
SELECT * INTO ##Customers FROM Customers
执行完上面的查询语句后,我们关掉查询页面,再重新打开一个页面查询
##Customers 中的内容
SELECT * FROM ##Customers
结果如下:
此时并不会像本地临时表那样报错了,全局临时表的位置如下:
它的名称与我们自定义的名称一致,系统不会额外添加其他信息。
1.8 临时表的用途
介绍完临时表,我们来说说如何用它来进行优化,临时表的优化一般使用在查询较多的情况下,也称为嵌套查询。我们写如下查询:
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中,然后从临时表中查询结果。
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)
执行情况如下:
相比上一次的逻辑读取,成倍地减少了逻辑读取次数。在对查询的性能进行调节时,如果逻辑读值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。如果逻辑读值增加,则表示调节措施降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。因此我们可以看出临时表在比较复杂的嵌套查询中是可以提高查询效率的。
1.9 总结:
临时表不管是在 SQL Server 还是其他平台都有使用,其在查询优化方面可以极大地提高查询效率,而 SQL Server 平台的临时表相比其他平台更容易创建和使用,其优越性不言而喻。所以如果平时工作或学习过程中,临时表可以作为一个必备技能经常使用。
-
一文 读懂 开源项目 OpenHarmonylanhy • 2.5w浏览 • 6回复
-
HarmonyOS基础之Fraction 用法 介绍中软国际AIoT开发者社区 • 1.2w浏览 • 0回复
-
一文 带你 读懂 数字管家开源基础软件社区官方 • 8374浏览 • 0回复
-
一文 读懂 HarmonyOS服务卡片怎么换肤HarmonyOS开发者 • 7228浏览 • 0回复
-
一文 带你 读懂 数字管家HarmonyOS开发者 • 2824浏览 • 0回复
-
你好奇过 MySQL 内部 临时 表 存了什么吗?chujichenxuyuan • 2782浏览 • 0回复
-
临时 表 和文件排序实现 group bychujichenxuyuan • 2072浏览 • 0回复
-
sql 学习 : sql 视图 的 的 创建与 用法 ,效率提高10倍lovepk • 4514浏览 • 0回复
-
SQL 学习 :实例讲解 SQL 必会 的 12个高频语句lovepk • 2488浏览 • 0回复
-
Sql 学习 :实例说明 SQL SELECT INTO 用法 ,看完你也会lovepk • 5014浏览 • 0回复
-
一文 读懂 Redisreiallen • 2297浏览 • 0回复
-
OpenHarmony 3GPP协议开发深度剖析—— 一文 读懂 RILOpenHarmony开发者 • 3864浏览 • 0回复
-
一文 详解EventMesh落地华为云 的 探索 及 实践罗锦荣AlexLuo • 5697浏览 • 2回复
-
基于MongoDB 的 SQL 数据服务Shineyang17 • 6109浏览 • 0回复
-
一文 读懂 Kubernetes 与 Docker大家好我是佩奇 • 1435浏览 • 0回复
-
MySQL8.0中消失又回来 的 磁盘 临时 表ywz888 • 1713浏览 • 0回复
-
一文 读懂 位运算ywz888 • 1336浏览 • 0回复
-
分库分 表 的 4种分片策略,所有 SQL 都逃不掉 的 一 步heatdog • 1552浏览 • 0回复
-
一文 快速入门分库分 表 (必修课)heatdog • 733浏览 • 0回复
- Sql学习:实例说明SQL SELECT INTO 用法,看完你也会 2022-04-25 15:17:58发布
- SQL学习:实例讲解两个sqlserver服务器之间链接查询 2022-04-25 15:12:31发布