表变量特点补充,为什么表变量在大数据情况下普遍性能不佳
来源:互联网 发布:h5如何进行shader编程 编辑:程序博客网 时间:2024/04/29 04:55
之前有写一篇文章
http://blog.csdn.net/starseeker7/article/details/8621046
今天看到论坛上在讨论这个东西,顺便更详细的补充一下
--2014/06/07补充:
我们再优化SQL时,经常会发现若对表变量填充大量数据,性能往往会不如使用临时表做相同动作
那么到底是上面的哪一点造成这个情况的呢?
最近看到一篇文章比较详细的测试了一下,发现是上面第六点最具有决定性的影响。
参考地址:http://blogs.msdn.com/b/psssql/archive/2010/08/24/query-performance-and-table-variables.aspx
测试环境搭建
set statistics profile offgocreate table t2 (c2 int)go--insert 100,000 rows into the perm tableset nocount ondeclare @i intset @i = 0while @i < 100000begininsert into t2 values (@i)set @i = @i + 1endgo--update statsupdate statistics t2
--测试底性能的执行计划
--2. join permantant table with table variable the table variable gets 100,000 rows inserted then it is joined to t2 @t1 gets 1 rows estimate it ends up with nested loop joinset nocount ondeclare @t1 table (c1 int)begin trandeclare @i intset @i = 0while @i < 100000begininsert into @t1 values (@i)set @i = @i + 1endcommit transet statistics profile onset statistics IO onselect * from @t1 inner join t2 on c1=c2goset statistics profile offset statistics IO offgo
--使用option关键字,进行强制重编译优化后的执行计划
--3. solution use stmt level recompiledeclare @t1 table (c1 int)set nocount onbegin trandeclare @i intset @i = 0while @i < 100000begininsert into @t1 values (@i)set @i = @i + 1endcommit transet statistics profile onset statistics IO onselect * from @t1 inner join t2 on c1=c2 option (recompile)goset statistics profile offset statistics IO offgo
我们可以看到而这性能差异很大,具体导致原因我们通过通过statistics profile获取的执行计划对比得出
他们的esimaterows区别很大,同样是table scan@t1第一次仅识别到1行,而第二个查询中,才能正确世界到10W行数据
这直接导致了他们采取了不同的inner join方式,第一个使用的是nested join而第二个使用的是hash match
而大数据情况下hash match具有非常明显的优势。这也就是为什么使用表值函数在应用到较多数据的情况下性能低下的根本原因。 0 0
- 表变量特点补充,为什么表变量在大数据情况下普遍性能不佳
- 表变量特点
- 让人泪奔的方法:两个变量在不使用其他变量的情况下进行数据交换
- 黑马程序员_10_成员变量_成员方法_静态成员方法_在多态情况下的特点
- intel集成显卡在ubuntu 9.04下性能不佳的解决方法
- C++中什么情况下要使用静态变量,我们为什么要使用静态变量
- 在int型变量不是16位的处理器的情况下,下列代码段是否正确?为什么?
- 在不增加新的变量情况下,值互换
- Block 在不同情况下的变量存储区域
- C/C++:在不使用第三个变量的情况下实现两个变量的交换
- 如何在不使用临时变量的情况下交换两个变量的值?
- 在不使用第三个变量的情况下,调换两个变量的值
- 补充:errno变量在内核中的定义
- 自动检测性能不佳的元数据
- 关于需要优化的大表在不影响 业务的情况下实现数据转移到新分区表
- java书写规范问题,for、while、do while{}后面不能直接定义变量或生成对象(在没有大括号的情况下)
- java书写规范问题,for、while、do while{}后面不能直接定义变量或生成对象(在没有大括号的情况下)
- 表变量的性能差异,表变量的妙用
- sqoop 导入数据到HDFS注意事项
- extjs xtype 类型说明
- python实现表单中插入表情符号
- NSString / NSData / char* 类型之间的转换
- int main(int argc,char *argv[])参数详解
- 表变量特点补充,为什么表变量在大数据情况下普遍性能不佳
- linux驱动头文件位置的说明
- cocos2d-x 学习笔记
- 夏天口腔上火怎么办
- ligerui实现select二级联动
- java.util.concurrent介绍
- 黑马程序员-Java构造函数和代码块的优先级
- 指针与引用的区别
- android短彩信附件机制