2012-01-30 43 views
5

我是否安全的假设,在那里我有存储使用tempdb写一个临时表的过程,我会更好,切换到这些表变量,以获得更好的性能?当用表变量速度比临时表

+1

临时表中有多少条记录,您的服务器配置(如表变量)可以推送到tempdb上。 http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx – Kane 2012-01-30 10:02:27

+0

数据不尽相同,但这是一个很好的观点。如果一个表变量会更好的表现少量的数据,那么我会将其切换。 – 2012-01-30 10:04:02

+0

可能重复[SQL Server中的临时表和表变量之间的区别是什么?](http://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table -variable-in-sql-server)或者这个:http:// stackoverflow。com/questions/6991511/sql-server-temp-table-vs-table-variable,可能更多 – gbn 2012-01-30 10:26:21

回答

1

临时表的性能更好。如果使用表变量并且变量中的数据变得太大,则SQL Server会将该变量自动转换为临时表。

它像几乎每个数据库相关的问题一样,取决于你想要做什么。所以没有更多的信息很难回答。

所以我的答案是,试试看看执行计划。以最低的成本使用最快的方式。

+0

我在顶部的评论是否合理,我应该切换吗? – 2012-01-30 10:16:37

+0

很难说,切换与否。如果你想返回一个表变量,并且你的操作在两种方式都很快,是的,我会切换。你真的应该尝试一下。例如,上周我优化了一个变得如此缓慢的查询。 20小时前,现在2分钟。我只是从表变量更改为临时表。返回的数据并不大,只有2000行,但有很多操作和过滤器。 – dknaack 2012-01-30 10:24:26

+3

“如果您使用表变量并且变量中的数据变得太大,则SQL Server会将变量自动转换为临时表。”这个陈述完全是错误的。 – 2013-10-20 19:15:36

1

@Table可以更快,因为这里少“设置时间”,因为对象是只读存储器。

@Tables虽然有很多捕获。

你可以在@Table上有一个主键,但那是关于它的。其他索引集群非集群组合的列是不可能的。

此外,如果你的表是要包含任何实际的数据量(高于约200也许1000行),然后访问该表会慢一些。特别是当你可能没有一个有用的索引。

#表格在调试时需要删除,因此需要花费更长时间才能创建。并且需要更长时间才能进行设置,因为您需要添加索引作为第二步。但是,如果你有大量的数据,那么它的#tables每次。

即使在你有你可能仍然要使用#Tables,你可以在表上创建一个有用的索引的表小于100行数据的情况。

总之,我使用@Tables大部分时间轻松做简单的PROC等,但任何需要执行应该是一个#Table时。

+0

我曾经相信这个寓言也一样,直到最近,我被卡住了清理查询和(我做的最后一件事)完全相同的查询(测试运行几次,使用相同的PARAMS)使用'#返回在5秒内TempTable'与使用'@ TableVar'的16秒相比 – Jason 2014-10-21 20:30:53

0

@Tables没有统计数据,所以执行计划需要更多的猜测。因此推荐的1000-ish行的上限。 #表格有统计数据,但是这两个调用之间有can be cached。如果每次SP运行时您的基数差异显着,则您每次都想要REBUILDRECOMPILE。当然,这是一项开销,但必须与垃圾计划的成本进行平衡。

这两种类型都会做IO to TempDB。因此,不,@表不是万能的。