临时表vs表变量以及它们对SQLServer性能的影响
2011-12-28 10:57
309 查看
在临时表
create table #T (…)
和表变量
declare @T table (…)
之间主要有3个理论上的不同。
第一个不同是:事务日志不会记录表变量。因此,它们脱离了事务机制的范围,从下面的例子可显而易见:
create table #T (s varchar(128))
declare @T table (s varchar(128))
insert into #T select 'old value #'
insert into @T select 'old value @'
begin transaction
update #T set s='new value #'
update @T set s='new value @'
rollback transaction
select * from #T
select * from @T
s
---------------
old value #
s
---------------
new value @
在声明临时表#T和表变量@T之后,给它们分配一个相同的值为old value字符串。然后,开始一个事务去更新它们。此时,它们都将有新的相同的值new value字符串。但当事务回滚时,正如你所看到的,表变量@T保留了这个新值而没有返回old value字符串。这是因为即使表变量在事务内被更新了,它本身不是事务的一部分。
第二个主要的不同是任何一个使用临时表的存储过程都不会被预编译,然而使用表变量的存储过程的执行计划可以预先静态的编译。预编译一个脚本的主要好处在于加快了执行的速度。这个好处对于长的存储过程更加显著,因为对它来说重新编译代价太高。
最后,表变量仅存在于那些变量能存在的相同范围内。和临时表相反,它们在内部存储过程和exec(string)语句里是不可见的。它们也不能在insert/exec语句里使用。
结论
在什么时候和什么地方使用临时表或表变量没有一个普遍的规则。试着都测试测试它们。
在你的测试里,少量的记录和大量的数据集都要进行测试。
当在你的存储过程里使用了复杂的逻辑的时候要小心迁移到SQL2005。相同的代码在SQLServer2005上可能运行要慢10到100倍。
--王成辉原创
create table #T (…)
和表变量
declare @T table (…)
之间主要有3个理论上的不同。
第一个不同是:事务日志不会记录表变量。因此,它们脱离了事务机制的范围,从下面的例子可显而易见:
create table #T (s varchar(128))
declare @T table (s varchar(128))
insert into #T select 'old value #'
insert into @T select 'old value @'
begin transaction
update #T set s='new value #'
update @T set s='new value @'
rollback transaction
select * from #T
select * from @T
s
---------------
old value #
s
---------------
new value @
在声明临时表#T和表变量@T之后,给它们分配一个相同的值为old value字符串。然后,开始一个事务去更新它们。此时,它们都将有新的相同的值new value字符串。但当事务回滚时,正如你所看到的,表变量@T保留了这个新值而没有返回old value字符串。这是因为即使表变量在事务内被更新了,它本身不是事务的一部分。
第二个主要的不同是任何一个使用临时表的存储过程都不会被预编译,然而使用表变量的存储过程的执行计划可以预先静态的编译。预编译一个脚本的主要好处在于加快了执行的速度。这个好处对于长的存储过程更加显著,因为对它来说重新编译代价太高。
最后,表变量仅存在于那些变量能存在的相同范围内。和临时表相反,它们在内部存储过程和exec(string)语句里是不可见的。它们也不能在insert/exec语句里使用。
结论
在什么时候和什么地方使用临时表或表变量没有一个普遍的规则。试着都测试测试它们。
在你的测试里,少量的记录和大量的数据集都要进行测试。
当在你的存储过程里使用了复杂的逻辑的时候要小心迁移到SQL2005。相同的代码在SQLServer2005上可能运行要慢10到100倍。
--王成辉原创
相关文章推荐
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 临时表vs.表变量以及它们对SQLServer性能的影响
- 影响SQLSERVER的性能的一些指标
- AJAX的适用范围以及对服务器的性能影响
- SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)
- SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)
- SQLServer数据类型优先级对性能的影响
- XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
- Sqlserver:性能诊断案例:在存储过程里,对同一个表,先select出结果集,然后删除,造成性能影响!
- 详解JS几种变量交换方式以及性能分析对比