分享

SQL Sever表变量和临时表的比较

 Jeln 2011-05-10
临时表:
CREATE TABLE #temp( id int NOT NULL, name varchar(100))
表变量:
DECLARE @temp table ( id int NOT NULL, name varchar(100))

不同:
1. 表变量脱离了事务机制的范围。rollback对表变量的数据不起作用。
2. 主要的不同是任何一个使用临时表的存储过程都不会被预编译,然而使用表变量的存储过程的执行计划可以预先静态的编译。预编译一个脚本的主要好处
在于加快了执行的速度。这个好处对于长的存储过程更加显著,因为对它来说重新编译代价太高。
3. 表变量仅存在于那些变量能存在的相同范围内。它在内部存储过程和exec(string)语句里是不可见的。
4. 使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通
过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。
5. 一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用SQL Server临时表,同时还可以创建索引,由于临时表是存放
在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。
6. 函数中不能支持SQL Server临时表。这是由于函数不能对函数作用域外部的资源状态造成永久性的更改,在SQLServer中也称为副作用(sideeffect)。
不过如果在函数中使用大型的临时结果集是不推荐的,因为如果将这样的函数放置到一个查询中会造成很明显的性能问题,因此这种情况一般都采用存储过程之类的批处理脚本。
7. 存储过程不接受表类型的参数。
8. 表变量虽然不支持索引,但是表变量支持主键阿,所以可以利用主键来替代索引。 9. 由于表变量不支持统计数据,因此在一个存储过程中使用表变量可以减少由于数据变化而导致的重新编译问题。 10.表变量同时也不支持并行执行计划,因此对于大型的临时结果集,表变量也不是一个好的选择





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多