32 临时表的用法
32.1 临时表定义
临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。当我们不再使用临时表的时候,临时表会自动删除。
32.2 临时表分类
临时表分为本地临时表和全局临时表,它们在名称、可见性以及可用性上有区别。
32.3 临时表的特性
对于临时表有如下几个特点:
(1)本地临时表
就是用户在创建表的时候添加了“#”前缀的表,其特点是根据数据库独立连接。只有创建本地临时表的数据库连接有表的访问权限,其他连接不能访问表。
不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQL Server中,通过特别的命名机制保证本地临时表在数据库连接上的独立性,意思是你可以在不同的连接里使用相同的本地临时表名称。
(2)全局临时表
是用户在创建表的时候添加“##”前缀的表,其特点是所有数据库连接均可以使用该全局临时表,当所有引用该临时表的数据库连接断开后自动删除。
全局临时表相比本地临时表,命名上就需要注意了,与本地临时表不同的是,全局临时表不能重复。
临时表利用了数据库临时表的空间,由数据库系统自动进行维护,因此节省了物理表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
32.4 本地临时表
本地临时表的名称以单个数字符号“#”打头,它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从SQL Server实例断开连接时被删除。
32.5 本地临时表实例
以Customers表为实例,表的数据如下:
我们新建一个连接,每当“新建查询”就代表打开了一个连接,连接的ID就是后面的数字。
下面我们在这个查询页面建立一个临时表:
SELECT * INTO #Csutomers FROM Customers;
这样我们就建好了一个临时表,可以查询一下临时表#Customers的数据。与Customers内容一致。
SELECT * FROM Customers;
如果我们再打开一个页面,同样查询#Customers就会发现查找不到。
说明本地临时表不支持跨连接查询。只能在当前连接(或者当前查询页面)访问。
32.6 全局临时表
全局临时表的名称以两个数字符号“##”打头,创建后对任何数据库连接都是可见的,当所有引用该表的数据库从SQL Server断开时被删除。
32.7 全局临时表实例
还是按照上面的步骤走一遍。
先打开一个查询页面,输入查询语句:
SELECT * INTO ##Customers FROM Customers;
执行完上面的查询语句后,我们关掉查询页面,再重新开一个页面查询##Customers中的内容:
SELECT * FROM ##Customers;
结果会正常显示。
它的名称与我们自定义的名称一致,系统不会额外添加其他信息。
32.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 SalesOrderDetaileID IN (SELECT SalesOrderDetaileID FROM #temp);
执行情况如下:
相比上一次的逻辑读取,成倍的减少了逻辑读取次数。在对查询的性能进行调节时,如果逻辑读取值下降,就表名查询使用的服务器资源减少,查询的性能有所提高。如果逻辑读取值增加,则表示调节措施降低了降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读取越少,其效率就越高,查询的速度就越快。
32.9 批注
临时表不管是在SQL Server还是在其他平台都有使用,其在查询优化方面可以极大的提高查询效率,而SQL Server平台的临时表相比其他平台更容易创建和使用,其优越性不言而喻。