在SQL Server 2005中,我们可以使用以下两种方式之一创建临时表:
declare @tmp table (Col1 int, Col2 int);
要么
create table #tmp (Col1 int, Col2 int);
两者之间有什么区别?对于@tmp是否仍使用tempdb或内存中是否发生了所有事情,我有不同意见。
在哪一种情况下胜过另一种?
临时表(#tmp)和表变量(@tmp)之间有一些区别,尽管使用tempdb并不是其中之一,如下面的MSDN链接中所述。
根据经验,对于中小型数据量和简单使用场景,应使用表变量。(这是一个过于宽泛的准则,当然会有很多例外情况-请参阅下文和后续文章。)
在它们之间进行选择时应考虑以下几点:
临时表是真实表,因此您可以执行诸如CREATE INDEXes等操作。如果您有大量数据,通过索引对其进行访问将更快,那么临时表是一个不错的选择。
通过使用PRIMARY KEY或UNIQUE约束,表变量可以具有索引。(如果您要非唯一索引,只需在唯一性约束中将主键列作为最后一列。如果没有唯一列,则可以使用标识列。)SQL 2014也具有非唯一索引。
表变量不参与事务,而SELECTs隐含在中NOLOCK。事务行为可能非常有帮助,例如,如果您想在过程中途回滚,则仍将填充该事务期间填充的表变量!
临时表可能导致存储过程可能经常被重新编译。表变量不会。
您可以使用SELECT INTO创建临时表,这样可以更快地编写(适用于即席查询),并且可以让您处理随时间变化的数据类型,因为您无需预先定义临时表结构。
您可以将表变量从函数传递回来,从而使您可以更轻松地封装和重用逻辑(例如,使函数将字符串拆分为任意定界符上的值表)。
在用户定义的函数中使用表变量可以使这些函数得到更广泛的使用(有关详细信息,请参见CREATE FUNCTION文档)。如果要编写函数,则应在临时表上使用表变量,除非另有迫切需要。
表变量和临时表都存储在tempdb中。但是表变量(自2005年起)默认为当前数据库的排序规则,而temp表则采用默认的tempdb(ref)排序规则。这意味着如果使用临时表并且您的数据库排序规则与tempdb的排序规则不同,则应该注意排序规则问题,如果要将临时表中的数据与数据库中的数据进行比较,则会引起问题。
全局临时表(## tmp)是可用于所有会话和用户的另一种临时表。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。