请教,表变量与临时表,理论上哪个占用资源少呀?
我有种认识,可能是误区,感觉表变量是在内存中的东西,应该比临时表快些,因为临时表是硬盘上的表呀,不知对否?
可是因为表变量只在内存中,所以如果记录数太多,内存装不下如何办呀?也要转到硬盘上呀,如果那样,会不会比临时表更占资源呀。
我要在存贮过程中处理一些较复杂的逻辑,不知用表变量好,还是用临时表好???
------解决方案--------------------内存装不下就放硬盘
操作系统不是专门有虚拟内存吗, 就是用硬盘去模拟的.
一般数据量较小, 而且基本上不再 join 什么的(表变量无法建立索引), 用表变量会好一些.
------解决方案--------------------表变量???怎么用呢?
----------------
下面是一个示例:
--定义
declare @t table(a int)
--装入数据
insert into @t
select 1 union all
select 13 union all
select 56 union all
select 156
--查询
select * from @t
------解决方案--------------------以下为转贴,特此说明:
什么情况下使用表变量?
什么情况下临时表?
---------------------------
表变量只存放在内存中,临时表需要写磁盘。所以一般情况下,用表变量会快些。
用法不太一样,有些时候用表变量更方便。
具体的再看SQL 2000的帮助。试用下就知道了。
---------------------------
个人观点:
1、表变量缺省放在内存,速度快,所以在触发器,存储过程里如果数据量不大,应该用表变量。
2、临时表缺省使用硬盘,一般来说速度比较慢,那是不是就不用临时表呢?也不是,在数据量比较大的时候,如果使用表变量,会把内存耗尽,然后使用TEMPDB的空间,这样主要还是使用硬盘空间,但同时把内存基本耗尽,增加了内存调入调出的机会,反而降低速度。这种情况建议先给TEMPDB一次分配合适的空间,然后使用临时表。
---------------------------
肤浅理解:
表变量:需要事先知道表结构
普通临时表:只在当前会话中可用与表变量相同 into一下就可以了,方便
全局临时表:可在多个会话中使用存在于temp中需显示的drop
---------------------------
要从表变量的作用域,支持不支持的操作,机器内存大小等几方面考虑。
如:
.表变量相当于ADO的RECORDSET,速度比临时表快得多。
表变量不能用在下列语句中:
INSERT INTO table_variable EXEC 存储过程。
SELECT select_list INTO table_variable 语句。
在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。
但临时表支持。
.表变量速度比临时表快得多(如果内存足够)
如果数据量不大:
微软 BOOK ON LINE 内说:尽可能使用表变量而不使用临时表
---------------------------
贴出来看看:
尽可能使用表变量而不使用临时表。table 变量有以下优点:
table 变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。
在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,table 不能用在下列语句中:
INSERT INTO table_variable EXEC 存储过程。
SELECT select_list INTO table_variable 语句。
在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。
在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。
涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
不支持在表变量之间进行赋值操作。另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。
---------------------------
个人认为:
1.表变量在内存中,临时表存放在硬盘上;
2.用临时表要考虑锁不锁表的问题;
3.数据量太大应该用临时表。
table 变量具有下列优点:
A. table 变量的行为类似于局部变量,有明确定义的作用域。这就是在其中声明该变量的函数、存储过程或批处理。
在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的任何地方。但是,table 不能用于以下语句中:
复制代码
SELECT select_list INTO table_variable
在定义 table 变量的函数、存储过程或批处理结束时,会自动清除此变量。
table 类型声明中的 CHECK 约束、DEFAULT 值和计算列不能调用用户定义函数。
在存储过程中使用 table 变量与使用临时表相比,减少了存储过程的重新编译量。
涉及 table 变量的事务只在 table 变量更新期间存在。因此减少了 table 变量对锁定和记录资源的需求。
不能显式创建 table 变量的索引,也不保留 table 变量的任何统计信息。在某些情况下,可以通过改用支持索引和统计信息的临时表来改善性能。有关临时表的详细信息,请参阅CREATE TABLE (Transact-SQL)。
可以在批处理的 FROM 子句中按名称引用 table 变量,如下例所示:
复制代码
SELECT Employee_ID, Department_ID FROM @MyTableVar
在 FROM 子句外,必须使用别名来引用 table 变量,如下例所示:
复制代码
SELECT EmployeeID, DepartmentID