`

局部临时表VS全局临时表

阅读更多
http://blog.csdn.net/wu_qionglei/article/details/5927042
http://www.cnblogs.com/pinbo/articles/1681673.html

临时表
SQL Server 支持临时表。临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。

临时表有两种类型:

本地临时表
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表。

全局临时表
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。
--应用本地临时表
declare @sql varchar(100)
set @sql='select ''123'' as a,''abasdf'' as b into #t'
exec(@sql)
select * from #t
go
/*发现不能正确显示临时表的数据
提示:
服务器: 消息 208,级别 16,状态 1,行 5
对象名 '#t' 无效。
*/

--修改为全局临时表
declare @sql varchar(100)
set @sql='select ''123'' as a,''abasdf'' as b into ##t'
exec(@sql)
select * from ##t
drop table ##t
go
/*可以正确显示临时表的数据
分析原因:exec(@sql) 相当于重新建立一个数据库对话,所以对于本地临时表,使用exec(@sql)创建临时表,
在exec外部不能正确访问;而使用全局临时表就ok了
*/

SQL code

    exec ('select top 10 * into ##temp from syhouse'); exec ('select * from ##temp');






==============================================================


表变量: 

  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的系统表。

分享到:
评论

相关推荐

    sql server 临时表详解与示例

    根据其作用范围的不同,临时表分为两种类型:局部临时表和全局临时表。 1. **局部临时表**:这种类型的临时表以`#`作为前缀,只对创建它的当前会话有效。当创建该临时表的连接断开时,局部临时表会被自动删除。 ...

    存储过程中的临时表使用方法

    根据其生命周期及可见性的不同,可以将临时表分为两种类型:局部临时表(Local Temporary Tables)和全局临时表(Global Temporary Tables)。 - **局部临时表**:以`#`作为前缀。此类表只在当前连接会话中可见,...

    Oracle中临时表的创建

    本文将详细介绍如何在Oracle中创建临时表,并探讨其应用场景以及两种主要类型的临时表:全局临时表(Global Temporary Table)与局部临时表(Local Temporary Table)的区别及其使用方法。 #### 二、Oracle临时表...

    delphi7实现SQL全局临时表防止用户重复登录

    全局临时表在数据库会话(session)间是可见的,不同于局部临时表,后者只在其创建的会话内可见。当所有引用全局临时表的会话结束时,该表会被自动删除。因此,我们可以利用这一特性来记录用户的登录状态。 以下是...

    sql_临时表.pdf

    临时表在 SQL Server 中分为两种类型:局部临时表(Local Temporary Tables)和全局临时表(Global Temporary Tables)。 局部临时表以单个井字号 (#) 开头,例如 `#Tmp`。这些表只对创建它们的当前用户会话可见,...

    SQL临时表应用.docx

    SQL 临时表是一种在数据库操作过程中暂时存储数据的表,主要分为两种类型:局部临时表(以单个井字号 `#` 开头)和全局临时表(以双井字号 `##` 开头)。这些表存储在 tempdb 系统数据库中,用于在执行复杂的查询、...

    SQL SERVER临时表的语法.docx

    临时表分为两种类型:局部临时表(以单个井号 `#` 开头)和全局临时表(以双井号 `##` 开头)。下面将详细介绍这两种临时表的特性和使用方法。 1. 局部临时表(#开头) 局部临时表仅对创建它的会话(连接)可见,...

    创建和使用临时表.pdf

    临时表分为两种类型:局部临时表(以单个井号 # 开头)和全局临时表(以双井号 ## 开头)。它们主要区别在于可见性和生命周期。 1. 局部临时表(#表名): - 只在创建它的会话中可见,其他会话无法访问。 - 当...

    Oracle兼容性和全局临时表的实现.pptx

    例如,删除全局临时表需要清理所有会话的局部缓冲和存储文件,创建索引时需要考虑已有数据的存在,而表的修改可能涉及所有会话的数据文件重写。此外,事务回滚和 vacuum/analyze操作也需要特殊处理,以保持数据的...

    sql_临时表 (2).pdf

    与局部临时表不同,全局临时表对所有用户会话可见,只要至少有一个会话在使用它,该表就不会被删除。一旦创建了全局临时表,任何拥有权限的用户都可以查询和修改这个表。然而,当最后一个引用这个表的会话结束时,...

    创建和使用临时表.docx

    临时表分为两种类型:局部临时表(以单个井号“#”开头)和全局临时表(以两个井号“##”开头)。 1. 局部临时表: - 只在其创建的会话中可见,其他会话无法访问。 - 当创建局部临时表的会话结束时,系统会自动...

    计算机等考三级数据库基础:临时表和游标的使用小总结.docx

    临时表分为局部临时表和全局临时表。局部临时表的名称以`#`开头,其生命周期与创建它的会话关联,也就是说,只有创建它的用户会话才能看到并使用这个表,当该用户会话结束时,局部临时表会被自动删除。例如,不同...

    sql_临时表.docx

    这意味着如果一个用户创建了一个全局临时表,其他用户也可以在自己的会话中使用该表,但只有在最后一个使用该表的会话断开时,全局临时表才会被系统自动删除。 创建和管理临时表的 SQL 语句包括 `CREATE TABLE`、`...

    sql的临时表使用小结

    需要注意的是,临时表可以是局部临时表或全局临时表。局部临时表以 `#` 开头,例如 `#tmpStudent`,只能在当前连接中使用,当前连接断开时自动删除。全局临时表以 `##` 开头,例如 `##MyTempTable`,可以在多个连接...

    sql_临时表 (2).docx

    SQL 临时表是一种在数据库操作中暂时存储数据的机制,主要分为两种类型:局部临时表(以单个井字号 `#` 开头)和全局临时表(以双井字号 `##` 开头)。这些表存储在 tempdb 系统数据库中,用于在执行一系列复杂查询...

    SQL SERVER临时表的语法.pdf

    - **局部临时表**:以单个井号 (#) 开头,如#Tmp。它们仅对创建它们的会话可见,当会话结束时自动删除。 - **全局临时表**:以双井号 (##) 开头,如##Tmp。全局临时表对所有会话可见,直到最后一个使用它的会话...

    浅析SQL server 临时表

    创建临时表,#代表局部临时表,##代表全局临时表。局部临时表和全局临时表的具体含义是什么呢? 举例说明一下比较清晰些,先来看下局部临时表,【新建查询】,在里面输入如下文本: 运行后,我们在此文件执行输入: ...

    对比Oracle临时表和SQL Server临时表的不同点

    - SQL Server的临时表数据也遵循类似的规则,局部临时表的数据对其他会话不可见,但全局临时表的数据可以被所有会话看到,直到特定条件满足(如会话结束或表被删除)。 3. **数据清理** - Oracle使用`ON COMMIT ...

    Sql Server临时表和游标的使用小结

    全局临时表的名称以符号 (##) 打头 任何用户都是可见的 当所有引用该表的用户断开连接时被自动删除 实际上局部临时表在tempdb中是有唯一名称的 例如我们用sa登陆一个查询分析器,再用sa登陆另一查询分析器 在2个...

    sql server 创建临时表的使用说明

    临时表分为两种类型:局部临时表(以单个井号`#`开头)和全局临时表(以双井号`##`开头)。 1. **创建临时表**: - 局部临时表创建语法:`CREATE TABLE #临时表名(字段1 约束条件, 字段2 约束条件, ...)` - 全局...

Global site tag (gtag.js) - Google Analytics