必胜高考网 > 计算机类 > 计算机等级 > 资讯 >

数据库:利用SQLServer临时表表变量的区别表现

时间: 家辉2 资讯

  varchar(2000), NewsDateTime datetime ) INSERT INTO dbo.#News (News_id, NewsTitle,

  NewsContent, NewsDateTime) VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE()) SELECT

  利用表变量

  DECLARE @News table ( News_id int NOT NULL, NewsTitle varchar(100),

  NewsContent varchar(2000), NewsDateTime datetime ) INSERT INTO @News

  (News_id, NewsTitle, NewsContent, NewsDateTime) VALUES (1,'BlueGreen',

  'Austen', 200801, GETDATE()) SELECT News_id, NewsTitle, NewsContent,

  NewsDateTime FROM @News

  我们可以看到上面两种情况实现的是一样的效果,第一种利用SQL Server临时表的时候,临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建,而定义表变量也不需要进行DROP Table的操作,一次执行完成后就会消失。

  其实在选择临时表还是表变量的时候,我们大多数情况下在使用的时候都是可以的,但一般我们需要遵循下面这个情况,选择对应的方式:

  1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。

  2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用SQL Server临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。

  注:表变量虽然不支持索引,但是表变量支持主键阿,所以可以利用主键来替代索引。

  注:由于表变量不支持统计数据,因此在一个存储过程中使用表变量可以减少由于数据变化而导致的重新编译问题。

  注:表变量同时也不支持并行执行计划,因此对于大型的临时结果集,表变量也不是一个好的选择

  对于函数中不能支持SQL Server临时表是由于函数不能对函数作用域外部的资源状态造成永久性的更改,在SQLServer中也称为副作用(sideeffect)。不过如果在函数中使用大型的临时结果集是不推荐的,因为如果将这样的函数放置到一个查询中会造成很明显的性能问题,因此这种情况一般都采用存储过程之类的批处理脚本。

  对于动态脚本不支持表变量的原因是因为存储过程不接受表类型的参数。不过如果表变量的声明和赋值都在sp_executesql的参数中的话,sp_executesql就可以执行了,因为这个时候表变量就存在sp_executesql的stmt参数里面,不需要传入,例如下面的代码:(当然这样的实用性也就没有多少了)

  DECLARE @m nvarchar(max) SET @m = N"DECLARE @t TABLE (ID int);INSERT INTO @tVALUES(1);SELECT * FROM @t T" EXEC sp_executesql @m 以上的相关内容就是对利用SQL Server临时表与利用表变量比较,望你能有所收获。

56055