区别一:

<PRE lang=sql>CREATE table #T (s varchar(128))
DECLARE @T table (s varchar(128))
INSERT into #T select 'old value #'
INSERT into @T select 'old value @'
BEGIN transaction
  UPDATE #T set s='new value #'
  UPDATE @T set s='new value @'
ROLLBACK transaction
SELECT * from #T
SELECT * from @T
s             
---------------
old value #

s                
---------------
new value @</PRE>

这行代码一目了然,临时表能起到事务回滚的作用,但是table变量不可以.作者解释是table变量不在事务作用范围之内.所以当table变量即使遇到回滚命令,但是也不会真的执行回滚.

区别二:
任何含有临时表的存储过程是不能被预编译的.这在一个很长的存储过程中,优势会更加凸显.

区别三:
table变量作为变量只能在同范围内存在,不可能跨范围.还有就是table变量在内置的存储过程中或者exec(string)语句中是不可见的还有就是不能被用于INSERT/EXEC statements.

下面的例子我来演示如何对比临时表和table变量在存储过程中预编译的区别.
创建一个测试表:

CREATE table NUM (n int primary key, s varchar(128))
GO
SET nocount on
DECLARE @n int
SET @n=1000000
WHILE @n>0 begin
  INSERT into NUM
    SELECT @n,'Value: '+convert(varchar,@n)
  SET @n=@n-1
  END
GO

然后创建存储过程:T1

CREATE procedure T1
  @total int
AS
  CREATE table #T (n int, s varchar(128))
  INSERT into #T select n,s from NUM
    WHERE n%100>0 and n<=@total
  DECLARE @res varchar(128)
  SELECT @res=max(s) from NUM
    WHERE n<=@total and
      NOT exists(select * from #T
      WHERE #T.n=NUM.n)
GO

这个存储过程的参数@Total给定的越大,那么执行的时间越长.

为精确测量存储过程执行时间,我使用了以下代码:

DECLARE @t1 datetime, @n int
SET @t1=getdate()
SET @n=100 – (**)
WHILE @n>0 begin
  EXEC T1 1000 – (*)
  SET @n=@n-1 end
SELECT datediff(ms,@t1,getdate())
GO

(*) 是存储过程参数.

现在我们给这个存储过程来第一次提速:个它加个主键

CREATE procedure T2
  @total int
AS
  CREATE table #T (n int primary key, s varchar(128))
  INSERT into #T select n,s from NUM
    WHERE n%100>0 and n<=@total
  DECLARE @res varchar(128)
  SELECT @res=max(s) from NUM
    WHERE n<=@total and
      NOT exists(select * from #T
      WHERE #T.n=NUM.n)
GO

在下面的对比中你可以发现已经大大的提速了.

然后再来一次提速:给它加个聚集索引

CREATE procedure T3
  @total int
AS
  CREATE table #T (n int, s varchar(128))
  INSERT into #T select n,s from NUM
    WHERE n%100>0 and n<=@total
  CREATE clustered index Tind on #T (n)
  DECLARE @res varchar(128)
  SELECT @res=max(s) from NUM
    WHERE n<=@total and
      NOT exists(select * from #T
      WHERE #T.n=NUM.n)
GO

很惊讶速度已经提高了很多!

那好了,咱们再来测试一下table变量的速度吧

CREARE procedure V1
  @total int
AS
  DECLARE @V table (n int, s varchar(128))
  INSERT into @V select n,s from NUM
    WHERE n%100>0 and n<=@total
  DECLARE @res varchar(128)
  SELECT @res=max(s) from NUM
    WHERE n<=@total and
      NOT exists(select * from @V V
      WHERE V.n=NUM.n)
GO

然后再来创建一个有主键的:

CREATE procedure V2
  @total int
AS
  DECLARE @V table (n int primary key, s varchar(128))
  INSERT into @V select n,s from NUM
    WHERE n%100>0 and n<=@total
  DECLARE @res varchar(128)
  SELECT @res=max(s) from NUM
    WHERE n<=@total and
      NOT exists(select * from @V V
      WHEREre V.n=NUM.n)
GO<

然后咱们来看看我测试的结果吧!

Table 1, using SQL Server 2000, time in ms

Records
T1 T2 T3 V1 V2
10 0.7 1 13.5 0.6 0.8
100 1.2 1.7 14.2 1.2 1.3
1000 7.1 5.5 27 7 5.3
10000 72 57 82 71 48
100000 883 480 580 840 510
1000000 45056 6090 15220 20240 12010

But the real shock is when you try the same on SQL Server 2005:

Table 2

N
T1 T2 T3 V1 V2
10 0.5 0.5 5.3 0.2 0.2
100 2 1.2 6.4 61.8 2.5
1000 9.3 8.5 13.5 168 140
10000 67.4 79.2 71.3 17133 13910
100000 700 794 659

Too long!

Too long!

1000000 10556 8673 6440

Too long!

Too long!

发现对比在某些情况下sql2000的速度要比2005的要快上很多!

结论:
没有通用的规则指导你什么时候用临时表什么时候用table变量.
将复杂逻辑的存储过程移植到sql2005的时候,要格外小心!他可能比2000的效率要慢上好几十倍的!
在你的实际测试中,请测试两个极端:销量数据和超大量数据.

此文章翻译自codeproject:http://www.codeproject.com/cs/database/SQP_performance.asp

转载于:https://www.cnblogs.com/FrameWork/archive/2007/06/07/774910.html

Table变量和临时表区别相关推荐

  1. SQL Server 表变量和临时表的区别

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

  2. mysql表变量临时表_表变量和临时表详解

    首先让我们来看看什么是表变量和临时表. sql server 表变量 1.初识表变量 表变量在sql server 2000中首次被引用.表变量的定义和创建一个表大致相同,只不过是使用DECLARE ...

  3. 【译】表变量和临时表的比较(转)

    关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么) ...

  4. mysql declare 赋值_sql server和mysql变量赋值的区别 以及 MySql Declare(转)

    sql server和mysql都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪. sql server中变量要先申明后赋值: 局部变量用 ...

  5. T-SQL 之 表变量和临时表

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

  6. 表变量与临时表的优缺点?(ZT)

    什么情况下使用表变量?   什么情况下临时表?   ---------------------------------------------------------------     表变量只存放 ...

  7. sql server 存储过程中使用变量表,临时表的分析(续)

    最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及. 在存储过程中使用临时表或变量表,使 ...

  8. 【译】表变量和临时表的比较

    关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么) ...

  9. 表变量与临时表的优缺点

    表变量与临时表的优缺点 什么情况下使用表变量?什么情况下使用临时表? 表变量: DECLARE @tb  table(id   int   identity(1,1), name   varchar( ...

  10. 表变量和临时表的使用

    表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,那么我们是否可以由此得出结论,使用表变量要比使用临时表效率高呢?相信有一部分人会和我有同样的想法,使用表变量的效率高,真是如此吗 ...

最新文章

  1. Spring-Boot:5分钟掌握SpringBoot开发
  2. matlab cell取一列,MATLAB cell struct
  3. apache文件服务器加权限,apache2运行权限设置
  4. C语言中可变参数列表
  5. 《PHP综合开发环境》(NuSphere PhpED v5.6.5615 Win32)[压缩包]
  6. 【软件工程】设计原则与设计模式
  7. hadoop中setup,cleanup,run和context讲解
  8. STM8单片机ADC连续采样模式
  9. GM8284DD(GM8284DR)LVDS转TTL芯片功能汇总及设计注意事项
  10. 简单好玩的手机编程代码
  11. Jmeter使用教程
  12. java jsp试卷_JSP试题-带答案
  13. web开发路径问题解决
  14. 猪圈密码 摩斯密码 QWE加密 栅栏加密 当铺密码
  15. Web The7安装
  16. MySQL Cluster 集群部署
  17. C#爬虫爬取京东自营笔记本
  18. Python数据分析与展示教程(北理工 嵩天教授)——展示数据基本方法
  19. 关于sata状态寄存器和错误寄存器的理解
  20. 欧美义务教育改革新视野:重估“家庭学校”的价值

热门文章

  1. oracle processes 的大小,Oracle中sessions和processes的大小关系(10g和11g不同)
  2. Python Poetry管理包安装速度慢的解决办法
  3. ML for trading -cs7646-02
  4. Swift 5用Template自动创建VIPER架构代码
  5. 算法:把排好序的链表转换为二叉排序树Convert Sorted List to Binary Search Tree
  6. 极客大学架构师训练营-架构师技术图谱-大作业二
  7. 用大数据挑选出国外最值得看的前50条swift教程(v.2019)
  8. NLP Prompt范式,两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀 (Prefix) prompt。
  9. MySQL常用命令介绍
  10. Torch环境搭建遇到的问题