`
北极的。鱼
  • 浏览: 152648 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】详解SQL Server中的临时表和表变量

阅读更多

  在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择。记得在给一家国内首屈一指的海运公司作SQL Server应用性能评估和调优的时候就看到过大量的临时数据集处理需求,而他们的开发人员就无法确定什么时候用临时表,什么时候用表变量,因此他们就简单的使用了临时表。实际上临时表和表变量都有特定的适用环境。

  先卖弄一些基础的知识:

  表变量

  变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime)。以@前缀的表变量是本地的,因此只有在当前用户会话中才可以访问,而@@前缀的表变量是全局的,通常都是系统变量,比如说@@error代表最近的一个T-SQL语句的报错号。当然因为表变量首先是个变量,因此它只能在一个Batch中生存,也就是我们所说的边界,超出了这个边界,表变量也就消亡了。

  表变量存放在内存中,正是因为这一点所有用户访问表变量的时候SQL Server是不需要生成日志。同时变量是不需要考虑其他会话访问的问题,因此也不需要锁机制,对于非常繁忙的系统来说,避免锁的使用可以减少一部分系统负载。

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

  临时表

  临时对象都以#或##为前缀,临时表是临时对象的一种,还有例如临时存储过程、临时函数之类的临时对象,临时对象都存储在tempdb中。以#前缀的临时表为本地的,因此只有在当前用户会话中才可以访问,而##前缀的临时表是全局的,因此所有用户会话都可以访问。临时表以会话为边界,只要创建临时表的会话没有结束,临时表就会持续存在,当然用户在会话中可以通过DROP TABLE命令提前销毁临时表。

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

  跟表变量另外一个显著去别就是临时表可以创建索引,也可以定义统计数据,因此SQL Server在处理访问临时表的语句时需要考虑执行计划优化的问题。

  表变量 vs. 临时表

  结论

  综上所述,大家会发现临时表和表变量在底层处理机制上是有很多差别的。

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

  一般对于大的数据集我们推荐使用临时表,同时创建索引,或者通过SQL Server的统计数据(Statisitcs)自动创建和维护功能来提供访问SQL语句的优化。如果需要在多个用户会话间交换数据,当然临时表就是唯一的选择了。需要提及的是,由于临时表存放在tempdb中,因此要注意tempdb的调优。

分享到:
评论

相关推荐

    sql server 临时表详解与示例

    2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。 3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除...

    临时表操作详解SQL Server 实例

    临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以 及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户...

    SQLServer恢复表级数据详解

    主要介绍了SQLServer中用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好,需要的朋友可以参考下

    SQLserver遍历所有表数据库命令

    SQL Server 遍历所有表数据库命令详解 在本文中,我们将详细介绍 SQL Server 遍历所有表数据库命令的实现方法和原理。本文将分为三个部分,分别介绍 SQL Server 的系统表和视图、游标的使用和存储过程的应用。 ...

    sqlserver 2008 创建数据表 详解

    sqlserver 2008 创建数据表 详解sqlserver 2008 创建数据表 详解sqlserver 2008 创建数据表 详解sqlserver 2008 创建数据表 详解

    详解SQL Server分布式查询

    详解SQL Server分布式查询 SQL Server中的分布式查询(Distributed Query)是指能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源。分布式查询与普通查询的区别在于它需要连接多个MSSQL...

    SQL Server如何通过创建临时表遍历更新数据详解

    (线上数据库用是SQL Server2012)关于数据统计汇总的问题肯定会用到遍历统计汇总,那么问题来了数据库中如何遍历呢?好像并没有for和foreach这种类型的功能呀,不过关于数据库遍历最常见的方法当然是大家经常会想到...

    SQLServer数据库的备份和还原详解

    SQLServer数据库的备份和还原详解SQLServer数据库的备份和还原详解

    详解SQL Server表和索引存储结构

    本文详细分析了SQL Server中表和索引结构存储的原理,以及对于如何加快搜索速度和提高效率等方面做了详细的分析。

    MS SQL Server分区表、分区索引详解

    MS SQL Server:分区表、分区索引 详解 1. 分区表简介 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。  大型表:数据量巨大的表。  访问模式:因目的不同,需访问的...

    SQL SERVER 2008高级主题 详解

    SQL SERVER 2008高级主题 详解SQL SERVER 2008高级主题 详解

    sql server 中 BCP使用方法详解

    sql server 中 BCP使用方法详解,快速从SQL SERVER中导入导出数据的命令

    sqlserver 2008 数据操作 详解

    sqlserver 2008 数据操作 详解sqlserver 2008 数据操作 详解sqlserver 2008 数据操作 详解

    SqlServer数据库同步方案详解

    SqlServer数据库同步方案详解 SqlServer数据库同步方案详解 SqlServer数据库同步方案详解

    SQL Server 表分区操作详解

    SQL Server 表分区操作详解 SQL Server 表分区操作是数据库性能优化的重要一步骤。通过将表格分区到独立的文件组中,可以提高数据库的并行处理性能,从而优化查询性能。建立分区表需要创建文件组,而创建多个文件组...

    sqlserver 2008 数据查询 详解

    sqlserver 2008 数据查询 详解sqlserver 2008 数据查询 详解sqlserver 2008 数据查询 详解

    SQL server 2005数据库系统表详解

    SQL server 2005数据库系统表详解

    SQL Server CROSS APPLY和OUTER APPLY的应用详解

    SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能

    sql server系统表详解

    详细的讲解系统表的内容,各个系统表的列名,数据类型,以及相关的描述等等

    sqlserver 表分区 详解

    您想提高SQL Server 数据库性能吗?您想研究一下表分区吗?这里有最详细的文档说明和示例!还等什么赶快下载吧!

Global site tag (gtag.js) - Google Analytics