精华内容
下载资源
问答
  • 表变量与临时表优缺点 什么情况下使用表变量?什么情况下使用临时表? 表变量:   DECLARE @tb table(id int identity(1,1), name varchar(100))   INSERT @tb   SELECT id, name ...

    表变量与临时表的优缺点

    什么情况下使用表变量?什么情况下使用临时表?

    表变量:  

      DECLARE @tb  table(id   int   identity(1,1), name   varchar(100))  
      INSERT @tb  

      SELECT id, name
      FROM mytable 

      WHERE name like ‘zhang%’ 

     

    临时表: 

      SELECT name, address
      INTO #ta   FROM mytable 
      WHERE name like ‘zhang%’

     

    表变量和临时表的比较:

    • 临时表是利用了硬盘(tempdb数据库) ,表名变量是占用内存,因此小数据量当然是内存中的表变量更快。当大数据量时,就不能用表变量了,太耗内存了。大数据量时适合用临时表。
    • 表变量缺省放在内存,速度快,所以在触发器,存储过程里如果数据量不大,应该用表变量。
    • 临时表缺省使用硬盘,一般来说速度比较慢,那是不是就不用临时表呢?也不是,在数据量比较大的时候,如果使用表变量,会把内存耗尽,然后 使用 TEMPDB的空间,这样主要还是使用硬盘空间,但同时把内存基本耗尽,增加了内存调入调出的机会,反而降低速度。这种情况建议先给TEMPDB一次分配 合适的空间,然后使用临时表。
    • 临时表相对而言表变量主要是多了I/O时间,但少了对内存资源的占用。数据量较大的时候,由于对内存资源的消耗较少,使用临时表比表变量有更好的性能。
    • 建议:触发器、自定义函数用表变量;存储过程看情况,大部分用表变量;特殊的应用,大数据量的场合用临时表。
    • 表变量有明确的作用域,在定义表变量的函数、存储过程或批处理结束时,会自动清除表变量。
    • 在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。
    • 涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
    • 表变量需要事先知道表结构,普通临时表,只在当前会话中可用与表变量相同into一下就可以了,方便;全局临时表:可在多个会话中使用存在于temp中需显示的drop。(不知道表结构情况下临时表方便一些)
    • 全局临时表的功能是表变量没法达到的。
    • 表变量不必删除,也就不会有命名冲突,临时表特别是全局临时表用的时候必须解决命名冲突。
    • 应避免频繁创建和删除临时表,减少系统表资源的消耗。
    • 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。
    • 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。
    • 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
    • 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。
    展开全文
  • Oracle 临时表临时表空间、临时表空间组用法、区别及表空间组优点临时表Oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此...

    Oracle 临时表、临时表空间、临时表空间组用法、区别及表空间组优点

    临时表

    Oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此的数据,也就是说临时表是会话独立的。并且不产生日志。
    Oracle 的临时表分为事务型和会话型。
    事务型临时表就是指在事务处理过程中插入的记录只在事务提交或回滚之前有效,一旦事务完成,表中的记录便被自动清除。
    会话型临时表指临时表中的数据在本次会话期间一直有效,直到会话结束。会话结束后表中针对此次会话的数据会自动清空。

    创建:
    CREATE GLOBAL TEMPORARY TABLE  tmp_test1 (id int,name varchar2(10)) ON COMMIT PRESERVE(DELETE) ROWS ;

    临时表空间
    temporary tablespace是用户在做数据排序都操作时临时存放的表空间
    查询 v$tempfile\ dba_temp_file

    每个用户都有一个默认临时表空间,在创建用户时如果没指定将使用oracle 数据库设置的默认临时表空间,查询方法是:
    select property_name,property_value from database_properties where property_value=‘TEMP’

    创建例子:
    create temporary tablespace test2 tempfile ‘/u01/app/oracle/oradata/ORCL/datafile/temp2.tmp’ size 50m autoextend on;

    设为数据库默认:

    SQL> aLTER DATABASE DEFAULT TEMPORARY TABLESPACE test2;

    Database altered.

    设置后以前未指定的用户临时表空间都为最新


    临时表空间组

    在oracle11g以后,用户可以创建临时表空间组,一个临时表空间组中可以包含一个或多个临时表空间。
    临时表空间组中必须由至少一个临时表空间组成,并且无明确的最大数量限制。
    如果删除一个临时表空间组的所有成员,该组也自动被删除。
    临时表空间的名字不能与临时表空间组的名字相同。
    在给用户分配的一个临时表空间时,可以使用临时表空间组的名字代替实际的临时表空间名;在给数据库分配默认临时表空间时,也可以使用临时表空间组的名字。

    创建临时表空间组:
    临时表空间组不需要特别创建,只需要在创建临时表空间时,
    使用teblespace group语句为其指定一个组即可。

    查看临时表空间组信息:
    数据字典dba_tablespace_grops

    移动临时表空间:
    使用alter tablespace语句

    临时表空间组是在创建临时表空间时通过指定group字句创建的,如果删除组中的全部临时表空间,那么这个组也将消失。

    创建例子:
    SYS@PROD1 > select * from dba_tablespace_groups;
    GROUP_NAME                     TABLESPACE_NAME
    ------------------------------ ------------------------------
    GROUP01                        TEMP2

    SYS@PROD1 > alter tablespace temp tablespace group group01;
    Tablespace altered.
    SYS@PROD1 > select * from dba_tablespace_groups;
    GROUP_NAME                     TABLESPACE_NAME
    ------------------------------ ------------------------------
    GROUP01                        TEMP
    GROUP01                        TEMP2

    SYS@PROD1 > select * from dba_temp_files;
    FILE_NAME                                             FILE_ID TABLESPACE_NAME                  BYTES     BLOCKS STATUS  RELATIVE_FNO AUT   MAXBYTES   MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS
    -------------------------------------------------- ---------- ------------------------------ ---------- ---------- ------- ------------ --- ---------- ---------- ------------ ---------- -----------
    /u01/app/oracle/oradata/PROD/temp01.dbf                     1 TEMP                             20971520       2560 ONLINE           1 YES 3.4360E+10    4194302           80   19922944     2432
    /u01/app/oracle/oradata/PROD/temp02.dbf                     2 TEMP2                            20971520       2560 ONLINE           1 NO           0          0            0   19922944     2432

    SYS@PROD1 > /

    FILE_NAME                                             FILE_ID TABLESPACE_NAME                     BYTES     BLOCKS STATUS  RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS
    -------------------------------------------------- ---------- ------------------------------ ---------- ---------- ------- ------------ --- ---------- ---------- ------------ ---------- -----------
    /u01/app/oracle/oradata/PROD/temp01.dbf                     1 TEMP                             20971520       2560 ONLINE            1 YES 3.4360E+10     4194302           80   19922944        2432
    /u01/app/oracle/oradata/PROD/temp02.dbf                     2 TEMP2                            20971520       2560 ONLINE            1 NO            0          0            0   19922944        2432

    使用临时表空间组,有如下的优点:
    1.避免当临时表空间不足时所引起的磁盘排序问题;
    2.当一个用户同时有多个会话时,可以使得它们使用不同的临时表空间;
    3.使得并行的服务器在单节点上,能使用多个临时表空间 .
    展开全文
  • 什么情况下使用临时表? ------------------------------------------------------------------------------------------------------------------------------ 表变量在批处理结束时自动被系统删除,所以你不必要...

    什么情况下使用表变量? 
    什么情况下使用临时表?

    ------------------------------------------------------------------------------------------------------------------------------

    表变量在批处理结束时自动被系统删除,所以你不必要像使用临时表一样显示的对它进行删除.
    表变量和临时表针对我们使用人员来说并没有什么不同,但是在存储方面来说,他们是不同的,表变量存储在内存中.所以在性能上和临时表相比会更好些! 
    3个理论上的不同。
    第一个不同是事务日志不会记录表变量。因此它们脱离了事务机制的范围。
    第二个主要的不同是任何一个使用临时表的存储过程都不会被预编译,然而使用表变量的存储过程的执行计划可以预先静态的编译。预编译一个脚本的主要好处在于加快了执行的速度。这个好处对于长的存储过程更加显著因为对它来说重新编译代价太高.
    最后表变量仅存在于那些变量能存在的相同范围内。和临时表相反它们在内部存储过程和execstring语句里是不可见的。它们也不能在insert/exec语句里使用


    ------------------------------------------------------------------------------------------------------------------------------

    表变量只存放在内存中,临时表需要写磁盘。所以一般情况下,用表变量会快些。

    用法不太一样,有些时候用表变量更方便。

     

    1.表变量在内存中,临时表存放在硬盘上; 
    2.用临时表要考虑锁不锁表的问题; 
    3.数据量太大应该用临时表。

     

    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 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。

    但是,table 不能用在下列语句中:

    INSERT INTO table_variable EXEC 存储过程。

    SELECT select_list INTO table_variable 语句。

    在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。

    在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。


    涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。 
    不支持在表变量之间进行赋值操作。另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

     

    表变量和临时表对比总结

    特性

    表变量

    临时表

    作用域

    当前批处理

    当前会话,嵌套存储过程,全局:所有会话

    使用场景

    自定义函数,存储过程,批处理

    自定义函数,存储过程,批处理

    创建方式

    DECLARE statement only.只能通过DECLEARE语句创建

    CREATE TABLE 语句

    SELECT INTO 语句.

    表名长度

    最多128字节

    最多116字节

    列类型

    可以使用自定义数据类型

    可以使用XML集合

    自定义数据类型和XML集合必须在TempDb内定义

    Collation

    字符串排序规则继承自当前数据库

    字符串排序规则继承自TempDb数据库

    索引

    索引必须在表定义时建立

    索引可以在表创建后建立

    约束

    PRIMARY KEY, UNIQUE, NULL, CHECK约束可以使用,但必须在表建立时声明

    PRIMARY KEY, UNIQUE, NULL, CHECK. 约束可以使用,可以在任何时后添加,但不能有外键约束

    表建立后使用DDL (索引,列)

    不允许

    允许.

    数据插入方式

    INSERT 语句 (SQL 2000: 不能使用INSERT/EXEC).

    INSERT 语句, 包括 INSERT/EXEC.

    SELECT INTO 语句.

    Insert explicit values into identity   columns (SET IDENTITY_INSERT).

    不支持SET IDENTITY_INSERT语句

    支持SET IDENTITY_INSERT语句

    Truncate table

    不允许

    允许

    析构方式

    批处理结束后自动析构

    显式调用 DROP TABLE 语句. 
      当前会话结束自动析构 (全局临时表: 还包括当其它会话语句不在引用表.)

    事务

    只会在更新表的时候有事务,持续时间比临时表短

    正常的事务长度,比表变量长

    存储过程重编译

    会导致重编译

    回滚

    不会被回滚影响

    会被回滚影响

    统计数据

    不创建统计数据,所以所有的估计行数都为1,所以生成执行计划会不精准

    创建统计数据,通过实际的行数生成执行计划。

    作为参数传入存储过程

    仅仅在SQL Server2008, 并且必须预定义   user-defined table type.

    不允许

    显式命名对象 (索引, 约束).

    不允许

    允许,但是要注意多用户的问题

    动态SQL

    必须在动态SQL中定义表变量

    可以在调用动态SQL之前定义临时表

     

    二、

    表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,那么我们是否可以由此得出结论,使用表变量要比使用临时表效率高呢?相信有一部分人会和我有同样的想法,使用表变量的效率高,真是如此吗?先从一次优化存储过程的经历说起。

          存储过程涉及到两个表,一个是用户今日积分表@tableUserScore(数据源来自用户积分详情表中的今日数据),一个是用户积分统计表 UserScoreSum,该存储过程逻辑就是统计@tableUserScore中用户不同原因的积分值,生成到表UserScoreSum中。数据量 不算很大,@tableUserScore中大概40万条,但这个存储过程执行时间却有些惊人,通常都在1个小时之上。优化的最终结果是将表变量@tabeUserScore换成了临时表#tableUserScore,并在userid和reason上添加了联合索引,优化的效果是执行时间控制在了40S左右。临时表和表变量效率相差百倍,这次优化经历让我对临时表和表变量有了重新认识,也有了一连串的疑问,它们是如何存储的,效率如何,如何选用?

    复制代码

    declare@tableUserScoretable(  
    userid int, --用户编号  
    name varchar(10), --用户姓名  
    reason varchar(32), --积分原因  
    score int--积分值  
    )  
      
    createtable UserScoreSum(  
    userid int, --用户编号  
    name varchar(10), --用户姓名  
    createTime datetime, --时间  
    reason1Score int, --原因1积分值  
    reason2Score int, --原因2积分值  
    reason3Score int, --原因3积分值  
    reason4Score int, --原因4积分值  
    )  

    复制代码

     

         以下是个人翻阅资料后的理解,总结出来希望能给和我有同样认识的人提个醒,起到抛砖引玉的作用,也希望大家对理解错误之处提出指正。

         临时表

         临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。本地临时表的名称都是以“#”为前缀,全局临时表的名称都是以“##”为前缀。

         临时表存储在tempdb中,因此临时表的访问是有可能造成物理IO的,当然在修改时也需要生成日志来确保一致性,同时锁机制也是不可缺少的。

         临时表可以创建索引,也可以定义统计数据,所以可以用数据定义语言(DDL)的声明来阻止临时表添加的限制,约束,并参照完整性,如主键和外键约束。

         表变量

         表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都 是以“@@”为前缀,一般都是系统的全局变量,像我们常用到的,如@@Error代表错误的号,@@RowCount代表影响的行数。

         表变量存放在内存中,正是因为这一点所有用户访问表变量的时候SQL Server是不需要生成日志。同时变量是不需要考虑其他会话访问的问题,因此也不需要锁机制,对于非常繁忙的系统来说,避免锁的使用可以减少一部分系统负载。[表变量存放在内存是有一定限制的,如果表变量数据量超过阈值,会把内存耗尽,然后使用TempDB的空间,这样主要还是使用硬盘空间,但同时把内存基本耗尽,增加了内存调入调出的机会,反而降低速度]

         表变量另外还有一个限制就是不能创建索引,当然也不存在统计数据的问题,因此在用户访问表变量的时候也就不存在执行计划选择的问题了(也就是以为着编译阶段后就没有优化阶段了),这一特性有的时候是件好事,而有些时候却会造成一些麻烦。

         临时表 vs. 表变量

         1.存储位置:临时表是利用了硬盘(tempdb数据库) ,表名变量是占用内存,因此小数据量当然是内存中的表变量更快。当大数据量时,就不能用表变量了,太耗内存了。大数据量时适合用临时表。

         2.性能:不能一概而论,表变量存储数据有个性能临界点,在这个临界点之内,表变量比临时表快,表变量是存储在内存中的。

         3.索引:表变量不支持索引和统计数据,但可以有主键;临时表则可以支持索引和统计数据。

         我们对于较小的临时计算用数据集考虑使用表变量。如果数据集比较大,如果 在代码中用于临时计算,同时这种临时使用永远都是简单的全数据集扫描而不需要考虑什么优化,比如说没有分组或分组很少的聚合(比如说COUNT、SUM、 AVERAGE、MAX等),也可以考虑使用表变量。使用表变量另外一个考虑因素是应用环境的内存压力,如果代码的运行实例很多,就要特别注意内存变量对 内存的消耗。一般对于大的数据集我们最好使用临时表,同时创建索引。

     

    PS:抱歉,没有找到原作者,引用cnblog的地址也是转载,这里就不说明了,如果坐着看到,可以联系我添加引用地址。

    展开全文
  • 什么情况下使用临时表? 表变量:   DECLARE @tb table(id int identity(1,1), name varchar(100))     INSERT @tb  SELECT id, name FROM mytable WHERE name like ‘zhang%’    临时表: ...

    什么情况下使用表变量?什么情况下使用临时表?

    表变量:  

      DECLARE @tb  table(id   int   identity(1,1), name   varchar(100))   
      

      INSERT @tb   

     SELECT id, name  FROM mytable   WHERE name like ‘zhang%’ 

     

    临时表: 

      SELECT name, address
      INTO #ta   FROM mytable  
      WHERE name like ‘zhang%’

    if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#ta') and type='U')
       drop table #ta

     

    表变量和临时表的比较:

    • 临时表是利用了硬盘(tempdb数据库) ,表名变量是占用内存,因此小数据量当然是内存中的表变量更快。当大数据量时,就不能用表变量了,太耗内存了。大数据量时适合用临时表。
    • 表变量缺省放在内存,速度快,所以在触发器,存储过程里如果数据量不大,应该用表变量。
    • 临时表缺省使用硬盘,一般来说速度比较慢,那是不是就不用临时表呢?也不是,在数据量比较大的时候,如果使用表变量,会把内存耗尽,然后使用 TEMPDB的空间,这样主要还是使用硬盘空间,但同时把内存基本耗尽,增加了内存调入调出的机会,反而降低速度。这种情况建议先给TEMPDB一次分配合适的空间,然后使用临时表。
    • 临时表相对而言表变量主要是多了I/O时间,但少了对内存资源的占用。数据量较大的时候,由于对内存资源的消耗较少,使用临时表比表变量有更好的性能。
    • 建议:触发器、自定义函数用表变量;存储过程看情况,大部分用表变量;特殊的应用,大数据量的场合用临时表。
    • 表变量有明确的作用域,在定义表变量的函数、存储过程或批处理结束时,会自动清除表变量。
    • 在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。
    • 涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
    • 表变量需要事先知道表结构,普通临时表,只在当前会话中可用与表变量相同into一下就可以了,方便;全局临时表:可在多个会话中使用存在于temp中需显示的drop。(不知道表结构情况下临时表方便一些)
    • 全局临时表的功能是表变量没法达到的。
    • 表变量不必删除,也就不会有命名冲突,临时表特别是全局临时表用的时候必须解决命名冲突。
    • 应避免频繁创建和删除临时表,减少系统表资源的消耗。
    • 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。
    • 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。
    • 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
    • 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。
    --------------------------------------------------

    问题 1:为什么在已经有了临时表的情况下还要引入表变量?

    解答 1:
    与临时表相比,表变量具有下列优点:
    如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量。
    与临时表相比,表变量导致存储过程的重新编译更少。
    涉及表变量的事务仅维持表变量上更新的持续时间。因此,使用表变量时,需要锁定和记录资源的情况更少。因为表变量具有有限的范围并且不是持久性数据库的一部分,所以事务回滚并不影响它们。
    问题 2:如果说使用表变量比使用临时表导致存储过程的重新编译更少,这意味着什么?

    解答 2:
    下面的文章讨论了重新编译存储过程的一些原因:

    243586  (http://support.microsoft.com/kb/243586/) 存储过程重新编译的疑难解答
    “由于某些临时表操作引起的重新编译”一节还列出了为避免一些问题(例如使用临时表导致重新编译)而需要满足的一些要求。这些限制不适用于表变量。

    表变量完全独立于创建这些表变量的批,因此,当执行 CREATE 或 ALTER 语句时,不会发生“重新解析”,而在使用临时表时可能会发生“重新解析”。临时表需要此“重新解析”,以便从嵌套存储过程引用该表。表变量完全避免了此问题,因此存储过程可以使用已编译的计划,从而节省了处理存储过程的资源。

    问题 3:表变量有哪些缺陷?

    解答 3:
    与临时表相比,它存在下列缺陷:
    在表变量上不能创建非聚集索引(为 PRIMARY 或 UNIQUE 约束创建的系统索引除外)。与具有非聚集索引的临时表相比,这可能会影响查询性能。
    表变量不像临时表那样可以维护统计信息。在表变量上,不能通过自动创建或使用 CREATE STATISTICS 语句来创建统计信息。因此,在大表上进行复杂查询时,缺少统计信息可能会妨碍优化器确定查询的最佳计划,从而影响该查询的性能。
    在初始 DECLARE 语句后不能更改表定义。
    表变量不能在 INSERT EXEC 或 SELECT INTO 语句中使用。
    表类型声明中的检查约束、默认值以及计算所得的列不能调用用户定义的函数。
    如果表变量是在 EXEC 语句或 sp_executesql 存储过程外创建的,则不能使用 EXEC 语句或sp_executesql 存储过程来运行引用该表变量的动态 SQL Server 查询。由于表变量只能在它们的本地作用域中引用,因此 EXEC 语句和 sp_executesql 存储过程将在表变量的作用域之外。但是,您可以在 EXEC 语句或 sp_executesql 存储过程内创建表变量并执行所有处理,因为这样表变量本地作用域将位于 EXEC 语句或 sp_executesql 存储过程中。
    问题 4:与临时表或永久表相比,表变量的仅存在于内存中的结构保证了更好的性能,是否因为它们是在驻留在物理磁盘上的数据库中维护的?

    解答 4:
    表变量不是仅存在于内存中的结构。由于表变量可能保留的数据较多,内存中容纳不下,因此它必须在磁盘上有一个位置来存储数据。与临时表类似,表变量是在  tempdb 数据库中创建的。如果有足够的内存,则表变量和临时表都在内存(数据缓存)中创建和处理。

    问题 5:必须使用表变量来代替临时表吗?

    解答 5:
    答案取决于以下三个因素:
    插入到表中的行数。
    从中保存查询的重新编译的次数。
    查询类型及其对性能的指数和统计信息的依赖性。
    在某些情况下,可将一个具有临时表的存储过程拆分为多个较小的存储过程,以便在较小的单元上进行重新编译。 

    通常情况下,应尽量使用表变量,除非数据量非常大并且需要重复使用表。在这种情况下,可以在临时表上创建索引以提高查询性能。但是,各种方案可能互不相同。Microsoft 建议您做一个测试,来验证表变量对于特定的查询或存储过程是否比临时表更有效。 
    展开全文
  • 临时表Oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此的数据,也就是说临时表是会话独立的。并且不产生日志。Oracle 的...
  • sql临时表优点

    2019-10-07 04:26:09
    1: 临时表来组织数据,更高效的查询速度。 2:临时表的操作不会写入日志文件;好处:提高了 临时表操作的速度;坏处: 数据一旦丢失,无法恢复。 3: 临时表只允许当前会话框进行访问,因此不会担心死锁 的问题。...
  • Oracle临时表空间组11g开始提供tempgroup,就是把当前创建的临时表空间组合起来,共同为数据库供服务, 一个临时表空间组至少包括一个临时表空间。临时表空间组支持以下操作:1.临时表空间支持组间移动(如果目标组不...
  • 临时表

    2021-01-21 13:36:39
    临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,在VFP退出时自动被释放。 特点: 临时表用于保存一些临时数据; 临时表只在当前连接可见。当关闭连接时,MySQL会删除临时表...
  • http://www.cnblogs.com/Mainz/archive/2008/12/20/1358897.html什么情况...什么情况下使用临时表?表变量:DECLARE @tb table(id int identity(1,1), name varchar(100)) INSERT @tbSELECT id, name FROM mytable
  • Oracle 临时表功能介绍:  Oracle中的临时表是全局的,需要在数据库设计时创建完成,而不是程序使用时。每个登陆用户都使用这一个相同的临时表,但互相之间看不到彼此的数据,也就是说临时表是会话独立的。并且不...
  • 什么情况下使用表变量?什么情况下使用临时表? 表变量: DECLARE @tb table(id int identity(1,1), name varchar(100)) INSERT @tb SELECT id, name FROM mytable...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,074
精华内容 38,029
关键字:

临时表的优点