我们经常使用临时表和表变量,那现在我们就对临时表和表变量进行一下讨论.

临时表

局部临时表

全局临时表

表变量

临时表

临 时表存储在TempDB数据库中,所有的使用此SQL Server 实例的用户都共享这个TempDB,因为我们应该确保用来存储TempDB数据库的 硬盘有足够的空间,以使之能够自己的增长.最好能够存储在一个拥有独立硬盘控制器上.因为这样不存在和其它的硬盘I/O进行争用.

我 们很多程序员认为临时表非常危险,因为临时表有可能被多个连接所共享.其实在SQL Server中存在两种临时表:局部临时表和全局临时表,局部临时表 (Local temp table)以#前缀来标识,并且只能被创建它的连接所使用.全局临时表(Global temp table)以##前缀来进 行标识,并且可以和其它连接所共享.

局部临时表

局部临时表不能够被其它连接所共享的原因其实是在SQL Server 2000中自动为局部临时表的表名后面加上了一个唯一字符来标识.如:

CREATE TABLE [#DimCustomer_test]

(

[CustomerKey] [int]

,   [FirstName] [nvarchar](50)

,[MiddleName] [nvarchar](50)

,[LastName] [nvarchar](50)

)

现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表#DimCustomer_test已经被加上了后缀:

USE TempDB

GO

SELECT name FROM sysobjects WHERE name LIKE ’%DimCustomer%’

the Result is:

name

#DimCustomer_test___________________________________________________________________________________________________000000000005

全局临时表

下面我们来看一下全局临时表:

CREATE TABLE [##DimCustomer_test]

(

[CustomerKey] [int]

,      [FirstName] [nvarchar](50)

,[MiddleName] [nvarchar](50)

,[LastName] [nvarchar](50)

)

现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表##DimCustomer_test没有被加上了后缀:

USE TempDB

GO

SELECT name FROM sysobjects WHERE name LIKE ’%DimCustomer%’

The Result are:

#DimCustomer_test___________________________________________________________________________________________________000000000005

##DimCustomer_test

--Drop test temp tables

DROP TABLE [##DimCustomer_test]

DROP TABLE [#DimCustomer_test]

可以看到我们刚才创建的全局临时表名字并没有被加上标识.

表变量

表变量和临时表针对我们使用人员来说并没有什么不同,但是在存储方面来说,他们是不同的,表变量存储在内存中.所以在性能上和临时表相比会更好些!

另一个不同的地方是在表连接中使用表变量时,要为此表变量指定别名.如:

USE AdventureWorksDW

GO

DECLARE @DimCustomer_test TABLE

(

[CustomerKey] [int]

,      [FirstName] [nvarchar](50)

,[MiddleName] [nvarchar](50)

,[LastName] [nvarchar](50)

)

---insert data to @DimCustomer_test

INSERT @DimCustomer_test

(

[CustomerKey]

,      [FirstName]

,[MiddleName]

,[LastName]

)

SELECT

[CustomerKey]

,      [FirstName]

,[MiddleName]

,[LastName]

FROM DimCustomer

SELECT [@DimCustomer_test].CustomerKey,SUM(FactInternetSales.OrderQuantity)

FROM @DimCustomer_test  INNER JOIN FactInternetSales   ON

@DimCustomer_test.CustomerKey = FactInternetSales.CustomerKey

Group BY CustomerKey

Result:

Server: Msg 137, Level 15, State 2, Line 32

Must declare the variable ’@DimCustomer_test’.

如果我们对上面的查询进行更改,对查询使用别名(并且找开IO):

-----in the follow script,we used the table alias.

DECLARE @DimCustomer_test TABLE

(

[CustomerKey] [int]

,      [FirstName] [nvarchar](50)

,[MiddleName] [nvarchar](50)

,[LastName] [nvarchar](50)

)

INSERT @DimCustomer_test

(

[CustomerKey]

,      [FirstName]

,[MiddleName]

,[LastName]

)

SELECT

[CustomerKey]

,      [FirstName]

,[MiddleName]

,[LastName]

FROM DimCustomer

SELECT t.CustomerKey,f.OrderQuantity

FROM @DimCustomer_test t INNER JOIN FactInternetSales  f ON

t.CustomerKey = f.CustomerKey

where t.CustomerKey=13513

表变量在批处理结束时自动被系统删除,所以你不必要像使用临时表表一样显示的对它进行删除.

文章来源:http://henrya2.blog.163.com/blog/static/754514192008102110528311

转载于:https://www.cnblogs.com/Henrya2/archive/2008/11/21/1344246.html

[导入]SQL中的临时表和表变量相关推荐

  1. SqlServer 中的临时表与表变量

    我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量.在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候 ...

  2. 在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  3. sql 表变量 临时表_SQL表变量概述

    sql 表变量 临时表 This article explores the SQL Table variables and their usage using different examples. ...

  4. SQL Server中临时表与表变量的区别

    我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量.在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候 ...

  5. SQL Server--[转]SQL Server中临时表与表变量的区别

    http://blog.csdn.net/skyremember/archive/2009/03/05/3960687.aspx 我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临 ...

  6. php sql server临时表,SQLServer中临时表与表变量的区别分析

    在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永 ...

  7. 存储过程中引用的常规表,临时表以及表变量是否会导致存储过程的重编译

    在存储过程中,经常要引用一些表来存储一些中间数据,用完即删.对于这个中间表,用常规表,临时表或者表变量有什么区别呢? 下面我们看一下这三种中间表是否会造成执行计划的重编译. 首先打开sql serve ...

  8. sql语句用变量替换表名_使用内存优化表替换SQL临时表和表变量

    sql语句用变量替换表名 TempDB usage can be considered as a performance bottleneck for workloads that use SQL t ...

  9. SQL Server中的内存优化表变量

    This article will cover the usage details and performance advantages of the memory-optimized table v ...

最新文章

  1. java B2B2C 源码 Springcloud多租户电子商城系统- Stream重新入队(RabbitMQ)
  2. java三大集合_java中三大集合框架
  3. 如何改变 Python 中线程的执行顺序
  4. Java设计模式之观察者Observer模式代码示例
  5. window screen (获取屏幕信息)
  6. ListView的使用用ViewHolder提升效率
  7. mysql-视图、事物等
  8. PyTorch 1.0 中文官方教程:使用PyTorch编写分布式应用程序
  9. IT项目验收流程及说明
  10. html表格边框线怎么加粗,CAD表格边框如何加粗?CAD表格边框加粗的方法
  11. 网络空间安全--密码学重点(适合提前自学的宝宝)
  12. python第二版课后答案第七章7.5_IDA7.5 启动基础配置
  13. 布同:基于JQuery的五子棋人机对战游戏设计与制作
  14. 企业微信三方开发(一):回调验证及重要参数获取
  15. 台式关掉计算机不断网,笔记本电脑在关掉屏幕后不断网设置方法
  16. h5页面分享朋友,朋友圈设置缩略图,自定义标题,描述!
  17. python文件的基本操作_Python文件基本操作
  18. 混音师的混音之道|公开我学习混音的方法,真正的捷径|MZD Studios
  19. ORACLE中添加删除主键
  20. linux字体技术原理

热门文章

  1. java自定义jsp标签_深入浅出javaWeb实战第17讲自定义JSP标签(上)
  2. C/C++语言中联合体union的妙用
  3. vc6可编译的 linux 源码,Linux 下源码编译FFMEG
  4. xml验证 java代码,使用Java代码进行XML验证
  5. 4gl 上传文件_文件管理密码相册工具app下载-文件管理密码相册工具app安卓版下载v1.8...
  6. mysql与java连接查询_【java】MySQL数据库之连接查询
  7. 趣学python3(48)--列出所有目录及子目录文件
  8. 【机器学习】浅析机器学习各大算法的适用场景
  9. 【CV】综述:基于深度学习的视觉跟踪方法进展
  10. 温州大学《机器学习》课程代码(三)逻辑回归