当前位置:  数据库>sqlserver

sql 表变量与临时表的实例解析

    来源: 互联网  发布时间:2014-08-29

    本文导语:  本节内容: sql中的表变量与临时表。 在sql server数据库中,表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,是否可以由此得出结论,使用表变量要比使用临时表效率高呢? 很多朋友可以有认为,使用表变...

本节内容:
sql中的表变量与临时表。

在sql server数据库中,表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,是否可以由此得出结论,使用表变量要比使用临时表效率高呢?

很多朋友可以有认为,使用表变量的效率高,真是如此吗?先从一次优化存储过程的经历说起。

存储过程涉及到两个表,一个是用户今日积分表@tableUserScore(数据源来自用户积分详情表中的今日数据),一个是用户积分统计表UserScoreSum,该存储过程逻辑就是统计@tableUserScore中用户不同原因的积分值,生成到表UserScoreSum中。

数据量不算很大,@tableUserScore中大概40万条,但这个存储过程执行时间却有些惊人,通常都在1个小时之上。

优化的最终结果是将表变量@tabeUserScore换成了临时表#tableUserScore,并在userid和reason上添加了联合索引,优化的效果是执行时间控制在了40S左右。

临时表和表变量效率相差百倍,这次优化经历让我对临时表和表变量有了重新认识,也有了一连串的疑问,它们是如何存储的,效率如何,如何选用?

例子:
 

代码示例:

declare @tableUserScore table(
    userid int, --用户编号
    name varchar(10), --用户姓名
    reason varchar(32), --积分原因
    score int --积分值
)

create table UserScoreSum(
    userid int, --用户编号
    name varchar(10), --用户姓名
    createTime datetime, --时间
    reason1Score int, --原因1积分值
    reason2Score int, --原因2积分值
    reason3Score int, --原因3积分值
    reason4Score int, --原因4积分值
)

以下是关于sql中临时表、表变量的一些理解,供大家参考。

临时表

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

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

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

表变量

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

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

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

临时表 vs. 表变量

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

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

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

对于较小的临时计算用数据集考虑使用表变量。如果数据集比较大,如果在代码中用于临时计算,同时这种临时使用永远都是简单的全数据集扫描而不需要考虑什么优化,比如说没有分组或分组很少的聚合(比如说COUNT、SUM、AVERAGE、MAX等),也可以考虑使用表变量。

使用表变量另外一个考虑因素是应用环境的内存压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。
一般对于大的数据集我们最好使用临时表,同时创建索引。

您可能感兴趣的文章:
SQL Server表变量与临时表的区别
sql server 表变量与临时表
Sql Server遍历表记录的二种方法(表变量与游标)


    
 
 

您可能感兴趣的文章:

  • Sql学习第一天——SQL 将变量定义为Table类型(虚拟表)
  • SqlServer中用exec处理sql字符串中含有变量的小例子
  • SQL Server表变量与临时表的区别
  • Shell脚本调用Sql脚本并向其中传递变量
  • 谁能告诉我 sql server 2000 jdbc驱动程序应该怎么设置,如果设环境变量怎么设,谢谢!
  • 一个方法中,用Connection con变量连接数据库,执行完sql以后,关闭con,返回resultset,报错“关闭的连接: next”
  • sql server使用变量动态命名临时表表名的例子
  • Web服务器/前端 iis7站长之家
  • Sql Server遍历表记录的二种方法(表变量与游标)
  • SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法
  • SQL Server遍历表中记录的2种方法(使用表变量和游标)
  • 怎样把变量代进SQL语句
  • 在sql查询中使用表变量
  • SQL Server中临时表与表变量用法区别
  • 关于SQL 存储过程入门基础(变量)
  • sql中参数过多利用变量替换参数的方法
  • sql语句实例 取得日志条目的sql语句
  • SQL分组排序去除重复实例
  • php防止sql注入代码实例
  • T-SQL实例 函数结果设置为列别名
  • 怎样不执行SELECT SQL语句即可获得ResultSetMetaData实例????
  • sql语句实例 统计一个特定页面中的相关链接
  • SQL分组排序去重复的小实例
  • sql语句实例 统计页面链接的sql语句
  • 教你怎么使用sql游标实例分享
  • mysqli多条sql语句查询实例
  • MSSQL中递归SQL查询语句实例说明-
  • sql语句not and or执行顺序(实例解析)
  • Sql Server中存储过程中输入和输出参数(简单实例 一看就懂)
  • SQL语句练习实例之七 剔除不需要的记录行
  • SQL cursor用法实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • oracle SQL解析步骤小结
  • MySQL的SQL语法解析器 DBIx-MyParse
  • SQL解析类库 SQLJEP
  • 解析MYSQL 数据库导入SQL 文件出现乱码的问题
  • Oracle中DBMS_SQL解析SQL语句的流程
  • 解析:清除SQL被注入恶意病毒代码的语句
  • 解析关于SQL语句Count的一点细节
  • 解析PL/SQL Developer导入导出数据库的方法以及说明
  • SQL分组查询实例解析
  • SQL_Server全文索引的用法解析
  • SQL嵌套查询示例解析
  • 解析sql语句中left_join、inner_join中的on与where的区别
  • 解析sql中得到刚刚插入的数据的id
  • 解析如何用SQL语句在指定字段前面插入新的字段
  • 解析Oracle查询和删除JOB的SQL
  • T-SQL 查询语句的执行顺序解析
  • 解析SQL语句中Replace INTO与INSERT INTO的不同之处
  • sql语句中like的用法详细解析
  • SQL Server 存储过程解析
  • php 导入sql到mysql数据库方法解析
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3