`
北极的。鱼
  • 浏览: 158969 次
  • 性别: 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如何通过创建临时表遍历更新数据详解

    在SQL Server中,遍历和更新大量数据时,通常有两种主要方法:游标和使用临时表。本篇文章将重点探讨如何通过创建临时表来遍历并更新数据,以避免使用游标带来的性能损耗和复杂性。 首先,游标虽然直观,但其缺点...

    sql server 生成交叉表

    在SQL Server中生成交叉表是一种常见的需求,特别是在进行数据分析时。本文将通过一个具体的例子来详细介绍如何利用SQL Server生成交叉表,并解释代码中的每一个步骤。 #### 标题:SQL Server生成交叉表 该标题...

    sql server 2008 存储过程与储发器 详解 书籍

    此外,还可以使用临时表和表变量在存储过程中暂存数据,提高处理效率。在优化方面,合理使用存储过程可以减少网络流量,但过度依赖存储过程也可能导致性能问题,因此需要根据实际情况权衡。 对于触发器,要特别注意...

    SQL Server 2000完结篇系列之八:SQL Server 2000过程优化详解

    5. **临时表和表变量**:临时表和表变量在处理大量数据时有各自的优缺点。根据场景选择合适的方式,可以改善处理性能。 6. **游标与批处理**:尽量避免使用游标,因为它们通常比批处理操作慢。如果必须使用,理解...

    SQLServer期末考试题目及答案.docx

    Transact-SQL 是 SQL Server 2000 的扩展语言,提供了程序控制结构、变量和函数等功能。 9. SQL Server 2000 字符型系统数据类型 SQL Server 2000 的字符型系统数据类型主要包括 char、varchar 和 text 等。 10. ...

    SQL中局部变量全局变量详解.doc

    ### SQL中的局部变量与全局变量详解 #### 一、引言 在数据库管理与开发过程中,使用变量可以极大地提高SQL脚本的灵活性和重用性。Transact-SQL(T-SQL)作为Microsoft SQL Server的主要查询语言,支持两种类型的...

    sqlserver存储过程

    存储过程是SQL Server中预编译的一系列SQL语句,它们存储在数据库中,可通过名称调用,以执行特定任务。几乎任何Transact-SQL代码都可以用来创建存储过程,从而实现复杂逻辑的封装和重用。 #### 存储过程设计规则 ...

    数据库sqlserver攻关

    SQL临时表分为本地临时表和全局临时表,它们都以#或##开头。临时表用于存储查询结果,通常用于存储中间结果或临时数据。 ### 排序 排序是SQL查询中的一个重要方面,经常使用ORDER BY子句来对查询结果进行排序。...

    sql server 死锁检测

    ### SQL Server 死锁检测详解 #### 死锁的基本概念 死锁是计算机科学领域一个重要...总之,理解并有效处理SQL Server中的死锁问题对于确保系统的稳定性和性能至关重要。通过上述方法可以有效地管理和避免死锁的发生。

    sqlserver中创建类似oracle序列的存储过程

    因此,在 SQL Server 中实现类似 Oracle 序列的功能需要通过其他方式,如存储过程、表变量等。 本文将详细介绍如何在 SQL Server 中创建一个模拟 Oracle 序列功能的存储过程,并通过示例代码展示其实现方法。 ####...

    查询SQL server数据库死锁存储过程

    这对于诊断和解决SQL Server中的死锁问题非常有帮助。此外,它还展示了如何使用SQL Server的系统表、函数和命令来实现这一目标。对于SQL Server管理员和开发人员来说,掌握这样的工具和技术是非常重要的。

    SqlServer触发器调用WebService

    本节将详细介绍如何在Sql Server中利用触发器来调用WebService。 ##### 3.1 触发器创建示例 根据提供的部分代码,我们可以看到一个具体的例子: ```sql CREATE TRIGGER [dbo].[DingTalkSendOAMsg] ON TableName ...

    SQL Server SQL优化

    对于大量数据的处理,应尽量避免使用游标,转而采用临时表或表变量等更高效的方法。 - **推荐做法**:在数据量较小的情况下使用表变量,而在数据量较大的情况下使用临时表。 - **不推荐做法**:直接使用游标进行...

    轻松搞定 sql server 2000 程序设计

    ### SQL Server 2000 程序设计核心知识点详解 #### 一、SQL Server 2000 概述 **SQL Server 2000** 是微软推出的一款功能强大、高度复杂的**关系型数据库管理系统**(RDBMS)。它支持多种应用需求,包括**在线事务...

    SQL Server多表查询优化方案集锦

    8. **使用临时表或表变量**:在处理大量数据时,临时表或表变量可以存储中间结果,减少内存压力和多次查询的开销。 9. **监控和调整统计信息**:保持统计信息的最新性有助于SQL Server做出更准确的查询计划。定期...

    MicroSoft Sql Server2005:T-Sql查询

    **Microsoft SQL Server 2005 T-SQL查询详解** SQL Server 2005是Microsoft公司推出的一款强大且广泛使用的数据库管理系统,它为开发者提供了丰富的功能和工具,特别是其Transact-SQL(T-SQL)语言,是进行数据查询...

    2021年SQL-Server-期末考试题目及答案教学教材.docx

    【SQL Server 期末考试知识点详解】 SQL Server是Microsoft公司推出的一款关系型数据库管理系统,广泛应用于企业级数据管理和分析。以下是对题目中涉及的SQL Server知识点的详细解释: 1. SQL Server 2000通常运行...

    sql server 游标实例

    ### SQL Server 游标实例详解 #### 一、游标概念与作用 在SQL Server中,游标是一种数据库对象,允许我们逐行处理查询结果集中...如果可能,尝试使用其他方法如表变量、临时表或者更高效的T-SQL语句来替代游标的使用。

    Oracle与SQLServer的SQL语法差异总结.docx

    而在SQL Server中,使用`CREATE PROCEDURE`命令,需要明确指定参数的长度,并在类型后加上OUTPUT或OUT来表示出参。 调用存储过程的方式也有所不同。Oracle可以直接使用存储过程名,参数在括号中列出,而SQL Server...

Global site tag (gtag.js) - Google Analytics