CTE,一时表,表变量区分跟详细合用场景剖析成绩(二)
出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。接上文"CTE,一时表,表变量区分跟详细合用场景剖析",我们再看一个成绩:----------------------------------------------------------------------------------------
成绩
----------------------------------------------------------------------------------------
例子1:
createprocedureProc1
as
begin
createtable#t1(aint,bint);
insertinto#t1values(1,2);
select*from#t1;
end
execProc1
go
execProc1
GO
例子2
createprocedureProc1
as
begin
createtable#t1(aint,bint);
insertinto#t1values(1,2);
execProc2;
end
go
createprocedureProc2
as
begin
select*from#t1;
end
go
execProc1
go
execProc1
go
我们能够看到,下面的2个例子,SP1跟SP2,
在SP1中第二次实行execProc1的时分,不会引发重编译,
可是在SP2中第二次实行execProc1的时分,却会引发重编译,为何呢?
----------------------------------------------------------------------------------------
谜底
----------------------------------------------------------------------------------------
1.第一个case,我好久之前常常用表变量往innerjoin别的的表,当发明表变量数据稍多,全部语句就会变的很差,以后就一向按“数据很少就用表变量,数据多点就用一时表。”刚看到这个贴子,就想了想查了查,次要缘故原由仍是表变量的行数未知,SQL优化器必需估一个值,这个值常常是很小,在这类情形下往innerjoin别的表,基础上城市是Nestedloopjoin,此时一旦表变量数据量年夜,功能将会变得极差。而这类情形下我们常常必要mergejoin或hashjoin才更无效率,recompile选项能让优化器往更新表变量的统计信息,而如许就可以依据统计信息天生公道的实行企图。
2.至于第二个关于存储历程的case,两个场景次要关头点仍是第二个proc2中援用非本人创立的一时表,这个援用是依托一时表ID,当实行proc1天生一时表时,名字(实行企图依托名字)稳定但id会变,而proc2依托这个id,这相称于proc2要查的一时表架构产生变更,以是每次都要重编译,假如在proc1里同时有两个execproc2,那末第二个不会重编译,由于此时它能够从头第一个execproc2的实行企图了,由于两个execproc2援用的一时表是同名同ID。目前的方案是用mysqlbinlog工具,增加一个flashback参数,输出结果为一个新的binlog文件――姑且叫做flashbacklog,这个flashbacklog顺序执行,可制定某张表和执行到哪个pos,来实现数据库的闪回。 以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了 理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。 我个人认为就是孜孜不懈的学习 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
页:
[1]