打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
临时表、表变量、CTE的比较
临时表、表变量、CTE的比较
 
 1、临时表
临时表包括:以#开头的局部临时表,以##开头的全局临时表。
 
a、存储
不管是局部临时表,还是全局临时表,都会放存放在tempdb数据库中。
 
b、作用域
局部临时表:对当前连接有效,只在创建它的存储过度、批处理、动态语句中有效,类似于C语言中局部变量的作用域。
全局临时表:在所有连接对它都结束引用时,会被删除,对创建者来说,断开连接就是结束引用;对非创建者,不再引用就是结束引用。
但最好在用完后,就通过drop  table 语句删除,及时释放资源。
 
c、特性
与普通的表一样,能定义约束,能创建索引,最关键的是有数据分布的统计信息,这样有利于优化器做出正确的执行计划,但同时它的开销和普通的表一样,一般适合数据量较大的情况。
有一个非常方便的select ... into 的用法,这也是一个特点。
  
 
2、表变量
a、存储
表变量存放在tempdb数据库中。
 
b、作用域
和普通的变量一样,在定义表变量的存储过程、批处理、动态语句、函数结束时,会自动清除。
 
c、特性
可以有主键,但不能直接创建索引,也没有任何数据的统计信息。
SQL Server是以表变量的数据在上千条前提,来生成执行计划的,所以表变量适合数据量相对较小的情况。
必须要注意的是,表变量不受事务的约束,下面的例子说明了这一点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[sql]
declare @tb table(v int primary key,vv varchar(10)) 
   
begin tran 
    insert into @tb 
    select 1,'aa' 
rollback tran 
   
   
--虽然上面回滚了事务,但还是会返回1条记录 
select * from @tb 
   
   
begin tran 
    update @tb 
    set vv= 'bb' 
    where v = 1 
rollback tran 
   
   
--返回的数据显示,update操作成功,根本没有回滚 
select * from @tb 
3、CTE
CTE,就是通用表表达式。
a、存储
产生的数据一般存储在内存,不会持久化存储。
也可以持久化:
[sql]
;with cte 
as 
select 1 as v,'aa' as vv 
union all 
select 2,'bb' 
   
--把cte的数据存储在tb_cte表 
select * into tb_cte 
from cte 
   
select * from tb_cte; 
   
   
--运用cte,删除数据 
;with cte_delete 
as 
select * from tb_cte 
   
delete from cte_delete where V = 1 
   
--返回1条数据,另一条已删除 
select * from tb_cte

 

 
当然,在实际运行时,有些部分,比如假脱机,会把数据存储在tempdb的worktable、workfile中,另外,一些大的hash join和排序操作,也会把中间数据存储在tempdba。
 
b、作用域
只存在于当前的语句。
 
c、特性
在同一个语句中,一次定义,可以多次引用。另外,可以定义递归语句,不过这个递归语句的性能,还不如写个while循环来的好。
 
之前在上家公司开发报表时,大量使用了CTE,一个CTE中包含了10到20个的语句,最后关联出结果集。也就是对每个小语句,根据引用语句中相关表的统计信息,估计产生多少行结果,然后再估计这些小语句产生的多个结果集,当再次进行关联时,估计会有多少行结果集,也就是对估计的结果,再次进行估计。
这样偏差就会越来越大,最终往往会导致产生的执行计划不够准确,这样往往会有性能问题。
 
其实,本质问题就是,一个语句几千行,语句太复杂了,SQL Server很难做出最优化的执行计划,这确实难为SQL Server了,所以后来就把这个CTE改为,每一小段语句,把结果集通过select into插入到临时表中,因为临时表是有统计信息的,这样最后关联多个临时表。
对SQL Server而言,现在有了每个小的结果集的精确的统计信息,那么就自然能做出更为精确的执行计划,执行性能自然上升。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数据库:SQLServer中with as 用法笔记
SQL SERVER临时表的使用
7-3
【译】表变量和临时表的比较
WITH AS 用法
PHP教程(13)mysql数据库备份+事物操作+触发器+用户管理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服