`

局部临时表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 临时表详解与示例

    3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。 临时表有两种,局部的和全局的.和普通表的表面上的区别就是 分别以#和##开头.她们是保存...

    浅析SQL server 临时表

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

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

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

    数据库和ado知识

    什么是全局临时表 什么是三层结构 三层结构的目的 具体的三层是哪三层 三层之间的关系 三层结构的优缺点 邮件发送方法 Excel导入导出 MD5加密解密方法 读取数据库后,判断dataset里列的值是否为空 项目术语

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

     全局临时表  2.2 表变量  限制条件  tempdb  范围和可见性  事务上下文  统计信息  2.3 tempdb相关的注意事项  2.4 表表达式  2.5 比较临时对象  2.6 综合练习——关系分区(Relational Division)  2.7...

    收获不知Oracle

    4.2.3.3 全局临时表两大重要特性 149 4.2.4 神通广大的分区表 153 4.2.4.1 分区表类型及原理155 4.2.4.2 分区表最实用的特性 165 4.2.4.3 分区索引类型简述176 4.2.4.4 分区表之相关陷阱177 4.2.5 有趣的索引组织表 ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    9.5.7 临时表和redo/undo 317 9.6 分析undo 321 9.6.1 什么操作会生成最多和最少的undo? 321 9.6.2 ORA-01555: snapshot too old错误 323 9.7 小结 334 第10章 数据库表 335 10.1 表类型 335 10.2 术语 337 ...

    单片机的存储器.doc

    前者在程序运行中为只读,一般为FLASH,用来放置程序代码和一些只 读的数据(如字模表之类),后者可以随机读写,用来存放程序运行中的临时数据,如 局部变量或全局变量,全局变量一直占用着RAM内存,而局部变量在...

    数据库应用系统.pdf

    A、自由表 B、表单 C、临时表 D、数组 2、创建数据库后,系统自动生成扩展名为 ________ 的三个文件。 A、 .SCX、.SCT、.SPX B、 .DBC、.DCT、.DCX C、 .PJX、.PJT、.RPJ D、 ...

    SQLServer2000高级编程技术-已添加书签,想学存储过程、SQL编程务必要看,分析非常透彻

    9.1.5 全局临时存储过程 9.1.6 远程存储过程 9.2 用户定义的函数 9.2.1 用户定义函数的设计 9.2.2 表值用户定义函数 9.2.3 行内的表值用户定义函数 9.2.4 在Enterprise Manager中管理用户定义的函数 9.3 触发器 ...

    SQLServer2000高级编程技术(part02)-想学存储过程 SQL编程 务必要看

    9.1.5 全局临时存储过程 9.1.6 远程存储过程 9.2 用户定义的函数 9.2.1 用户定义函数的设计 9.2.2 表值用户定义函数 9.2.3 行内的表值用户定义函数 9.2.4 在Enterprise Manager中管理用户定义的函数 9.3 触发器 ...

    oracle数据库经典题目

    数据库表空间分为系统表空间和非系统表空间两类,其中非系统表空间包括撤销表空间、临时表空间和用户表空间等。 SYSTEM表空间主要用于存储数据库的数据字典、PL/SQL程序的源代码和解释代码、数据库对象的定义。撤销...

    程序设计语言编译原理 (陈火旺)

    10.4.5利用数据流信息进行全局优化 练 习 第十一章 目标代码生成 11.1基本问题 11.2目标机器模型 11.3一个简单的代码生成器 11.3.1待用信息 11.3.2寄存器描述和地址描述 11.3.3代码生成算法 11.4寄存器分配...

    C语言 动态内存分配详解

    \在C语言中,全局变量分配在内存中的静态存储区,非静态的局部变量(包括形参)是分配在内存的动态存储区,该存储区被称为栈。除此之外,c语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必

    SQL21日自学通

    临时表254 Title 257 游标259 创建游标260 打开游标260 使用游标来进行翻阅261 测试游标的状态262 关闭游标263 游标的适用范围264 创建和使用存贮过程265 在存贮过程中使用参数267 删除一个存贮过程269 存贮过程的...

    编译原理全套

    7.3.2 临时名字的重新使用 7.3.3 数组元素的地址计算 7.3.4 数组元素地址计算的翻译方案 7.3.5 类型转换 7.4 布尔表达式和控制流语句 7.4.1 布尔表达式的翻译 7.4.2 控制流语句的翻译 7.4.3 布尔表达式的控制...

    [编译原理].陈意云.文字版

    7.3.2 临时名字的重新使用 7.3.3 数组元素的地址计算 7.3.4 数组元素地址计算的翻译方案 7.3.5 类型转换 7.4 布尔表达式和控制流语句 7.4.1 布尔表达式的翻译 7.4.2 控制流语句的翻译 7.4.3 布尔...

    操作系统相关题目总结

     *进程虚拟地址空间包括:代码段、堆栈段(临时数据:如函数参数、返回地址和局部变量)、数据段(包括全局变量)、堆(动态分配的内存)等等。  3.线程运行在进程的上下文中,所有运行在一个进程内的线程共享该进程...

    oracle数据库dba管理手册

    12.6 局部管理的表空间 361 第三部分 网络Oracle 第13章 SQL*Net V2和Net8 363 13.1 SQL*Net V2和Net8概述 363 13.1.1 连接描述符 365 13.1.2 服务名 366 13.1.3 监听程序 367 13.1.4 Oracle8i中的监听程序 368 ...

    零起点学通C++多媒体范例教学代码

    3.5 局部变量 3.6 全局变量 3.7 总结 第4章 C4-+数据类型 4.1 变量的定义 4.2 将变量及数据存储在内存中 4.3 布尔型变量 4.4 字符型变量 4.5 wchart双字符型变量 4.6 整型概述 4.7 整型变量的定义 4.8 浮点型变量 ...

Global site tag (gtag.js) - Google Analytics