表变量特点补充,为什么表变量在大数据情况下普遍性能不佳
2014-06-07 17:24
363 查看
之前有写一篇文章
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
测试环境搭建
--测试底性能的执行计划
--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 join
--使用option关键字,进行强制重编译优化后的执行计划
![](http://img.blog.csdn.net/20140607170734062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RhcnNlZWtlcjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20140607170753421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RhcnNlZWtlcjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们可以看到而这性能差异很大,具体导致原因我们通过通过statistics profile获取的执行计划对比得出
他们的esimaterows区别很大,同样是table scan@t1第一次仅识别到1行,而第二个查询中,才能正确世界到10W行数据
这直接导致了他们采取了不同的inner join方式,第一个使用的是nested join而第二个使用的是hash match
而大数据情况下hash match具有非常明显的优势。这也就是为什么使用表值函数在应用到较多数据的情况下性能低下的根本原因。
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 off go create table t2 (c2 int) go --insert 100,000 rows into the perm table set nocount on declare @i int set @i = 0 while @i < 100000 begin insert into t2 values (@i) set @i = @i + 1 end go --update stats update 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 join
set nocount on declare @t1 table (c1 int) begin tran declare @i int set @i = 0 while @i < 100000 begin insert into @t1 values (@i) set @i = @i + 1 end commit tran set statistics profile on set statistics IO on select * from @t1 inner join t2 on c1=c2 go set statistics profile off set statistics IO off go
--使用option关键字,进行强制重编译优化后的执行计划
--3. solution use stmt level recompile declare @t1 table (c1 int) set nocount on begin tran declare @i int set @i = 0 while @i < 100000 begin insert into @t1 values (@i) set @i = @i + 1 end commit tran set statistics profile on set statistics IO on select * from @t1 inner join t2 on c1=c2 option (recompile) go set statistics profile off set statistics IO off go
我们可以看到而这性能差异很大,具体导致原因我们通过通过statistics profile获取的执行计划对比得出
他们的esimaterows区别很大,同样是table scan@t1第一次仅识别到1行,而第二个查询中,才能正确世界到10W行数据
这直接导致了他们采取了不同的inner join方式,第一个使用的是nested join而第二个使用的是hash match
而大数据情况下hash match具有非常明显的优势。这也就是为什么使用表值函数在应用到较多数据的情况下性能低下的根本原因。
相关文章推荐
- [EnterpriseLibrary]为什么拒绝ASPNET对性能数据进行访问
- 为什么Spring的HibernateTemplate一般情况下不支持数据的惰性加载的源码分析
- ios中qq在进入后台的情况下为什么还能接收到数据
- 很少训练数据情况下的模型性能对比
- JMeter性能测试-请求数据参数设置-自动增长变量
- [EnterpriseLibrary]为什么拒绝ASPNET对性能数据进行访问
- 让人泪奔的方法:两个变量在不使用其他变量的情况下进行数据交换
- 让人泪奔的方法:两个变量在不使用其他变量的情况下进行数据交换
- 为什么要引入锁(无论什么数据库软件引入锁的目的都是因数据不一致的三种情况,这里介绍的是MS-SQLSERVER )
- static(静态)变量的作用、初始化特点以及类中静态数据成员的特点
- [EnterpriseLibrary]为什么拒绝ASPNET对性能数据进行访问
- 不同数据类型变量在不同CPU或MCU下的内存占用情况还与编译器或编译选项有关
- register_globals使用详解 为什么我的表单无法传递数据?为什么我的程序无法得到传递过来的变量?
- 黑马程序员_10_成员变量_成员方法_静态成员方法_在多态情况下的特点
- 性能测试新手误区(二):为什么我模拟的百万测试数据是无效的
- 针对数据库中处理提取多份实体,而这些实体又分别包含1对多的相关数据情况的性能的架构
- .net 性能测试2--变量和数据对象的使用
- 做产品时一定得看数据吗?不论任何情况一定要问十万个为什么吗?
- 关于C++ 类数据成员初始化的一点总结【为什么类定义中不能初始化成员变量】
- 性能测试新手误区(二):为什么我模拟的百万测试数据是无效的?