Table变量和临时表区别
区别一:
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变量在存储过程中预编译的区别.
创建一个测试表:
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
@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给定的越大,那么执行的时间越长.
为精确测量存储过程执行时间,我使用了以下代码:
SET @t1=getdate()
SET @n=100 – (**)
WHILE @n>0 begin
EXEC T1 1000 – (*)
SET @n=@n-1 end
SELECT datediff(ms,@t1,getdate())
GO
(*) 是存储过程参数.
现在我们给这个存储过程来第一次提速:个它加个主键
@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
在下面的对比中你可以发现已经大大的提速了.
然后再来一次提速:给它加个聚集索引
@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变量的速度吧
@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
然后再来创建一个有主键的:
@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<
然后咱们来看看我测试的结果吧!
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:
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变量和临时表区别相关推荐
- SQL Server 表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- mysql表变量临时表_表变量和临时表详解
首先让我们来看看什么是表变量和临时表. sql server 表变量 1.初识表变量 表变量在sql server 2000中首次被引用.表变量的定义和创建一个表大致相同,只不过是使用DECLARE ...
- 【译】表变量和临时表的比较(转)
关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么) ...
- mysql declare 赋值_sql server和mysql变量赋值的区别 以及 MySql Declare(转)
sql server和mysql都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪. sql server中变量要先申明后赋值: 局部变量用 ...
- T-SQL 之 表变量和临时表
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- 表变量与临时表的优缺点?(ZT)
什么情况下使用表变量? 什么情况下临时表? --------------------------------------------------------------- 表变量只存放 ...
- sql server 存储过程中使用变量表,临时表的分析(续)
最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及. 在存储过程中使用临时表或变量表,使 ...
- 【译】表变量和临时表的比较
关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么) ...
- 表变量与临时表的优缺点
表变量与临时表的优缺点 什么情况下使用表变量?什么情况下使用临时表? 表变量: DECLARE @tb table(id int identity(1,1), name varchar( ...
- 表变量和临时表的使用
表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,那么我们是否可以由此得出结论,使用表变量要比使用临时表效率高呢?相信有一部分人会和我有同样的想法,使用表变量的效率高,真是如此吗 ...
最新文章
- Spring-Boot:5分钟掌握SpringBoot开发
- matlab cell取一列,MATLAB cell struct
- apache文件服务器加权限,apache2运行权限设置
- C语言中可变参数列表
- 《PHP综合开发环境》(NuSphere PhpED v5.6.5615 Win32)[压缩包]
- 【软件工程】设计原则与设计模式
- hadoop中setup,cleanup,run和context讲解
- STM8单片机ADC连续采样模式
- GM8284DD(GM8284DR)LVDS转TTL芯片功能汇总及设计注意事项
- 简单好玩的手机编程代码
- Jmeter使用教程
- java jsp试卷_JSP试题-带答案
- web开发路径问题解决
- 猪圈密码 摩斯密码 QWE加密 栅栏加密 当铺密码
- Web The7安装
- MySQL Cluster 集群部署
- C#爬虫爬取京东自营笔记本
- Python数据分析与展示教程(北理工 嵩天教授)——展示数据基本方法
- 关于sata状态寄存器和错误寄存器的理解
- 欧美义务教育改革新视野:重估“家庭学校”的价值
热门文章
- oracle processes 的大小,Oracle中sessions和processes的大小关系(10g和11g不同)
- Python Poetry管理包安装速度慢的解决办法
- ML for trading -cs7646-02
- Swift 5用Template自动创建VIPER架构代码
- 算法:把排好序的链表转换为二叉排序树Convert Sorted List to Binary Search Tree
- 极客大学架构师训练营-架构师技术图谱-大作业二
- 用大数据挑选出国外最值得看的前50条swift教程(v.2019)
- NLP Prompt范式,两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀 (Prefix) prompt。
- MySQL常用命令介绍
- Torch环境搭建遇到的问题