设为首页 收藏本站
查看: 882|回复: 0

[经验分享] SQL Server 2005 中新CTE语法 递归性能测试

[复制链接]

尚未签到

发表于 2015-7-3 11:03:18 | 显示全部楼层 |阅读模式
  SQL Server 205针对数据操作语言DML增加了相当多的语法,例如 CTE,Pivot,UnPivot 等,今天想把以前的展开BOM(Bill of Materials)的旧方法用CET实现,看可不可以提高性能,测试最后还是不要动好。CET(Common table expression)兼具视图表和衍生数据表的能力。你可以视之为临时的视图表,或是在同一批处理查询语法中可重复使用的衍生数据表。
  先看下要测试的BOM结构,EL_NO是物料或半成品,BO_NO是EL_NO的上阶,BO_USE是用量,EL_INVID是表示是物料还是机种或成品,整张BOM表差不多5W行数据
http://files.iyunv.com/elzero/images/08090403.jpg
  
  1.旧的递归方法
  ALTER FUNCTION [dbo].[f_bom_dal]
(
@bo_no   nvarchar(15)
)
RETURNS
@r Table(   
   line  varchar(255),  
   el_no  nvarchar(15),     
   el_name nvarchar(20),   
   bo_use float,   
   el_invid nchar(1),  
   level  int, --层次   
   sid  varchar(255)) --排序字段,通过这个来排序,可以体现出树形的层次
AS
BEGIN
declare   @l   int,  @ReStr as varchar(50)   
select  @l=0,@ReStr='';
  insert   @r   select bo_no,el_no,el_name,1,el_invid,@l,@bo_no   
from   Robo00_dal   
where  bo_no=@bo_no and bo_use is null  
while   @@rowcount>0   
begin   
set   @l=@l+1   
insert   @r   select substring(Left(@ReStr,@l)+'├──────────────────',1,8),b.el_no,b.el_name,b.bo_use*r.bo_use,b.el_invid,@l,r.sid+'_'+b.el_no   
from   robo00_dal b,@r   r   
where   r.level=@l-1
and   b.bo_no=r.el_no  
and   b.bo_use>0   
end
RETURN
END
  
  2.改用CET的方法SQL语句
  
  ALTER FUNCTION [dbo].[f_bom_dal_1]
(
@bo_no   nvarchar(15)
)
RETURNS
@r Table(   
   line  varchar(255),  
   el_no  nvarchar(15),     
   el_name nvarchar(20),   
   bo_use float,   
   el_invid nchar(1),  
   level  int, --层次   
   sid  varchar(255)) --排序字段,通过这个来排序,可以体现出树形的层次
AS
BEGIN
-- Fill the table variable with the rows for your result set
WITH T(line,el_no,el_name,bo_use,el_invid,level,sid) AS(
  SELECT  bo_no,el_no,el_name,convert(float,1.0),el_invid,0,@bo_no from Robo00_dal where bo_no=@bo_no and bo_use is null  
  UNION ALL
  SELECT r.bo_no,r.el_no,r.el_name,convert(float,T.bo_use*r.bo_use),r.el_invid,T.level+1 level,r.el_no sid FROM ROBO00_dal r INNER JOIN T ON r.bo_no=T.el_no and r.bo_use>0   
)
INSERT INTO @r SELECT * FROM T
  RETURN
END
  
  测试结果:
http://files.iyunv.com/elzero/images/08090401.jpg
  从图可以看出用旧的 While 方法只用了 453ms,而新的的CTE递归用了8530ms,测试同一机种,返回的结果都是646行(即这个机种用了多少个半成品或物料)
  细心的朋友可能会发现,两种方法返回的结果(line和sid列)不一样,是的。因为CTE递归创建数据时,不变成员和递归成员的数据结构要完全一样,包括数据类型、长度与精确位数(不然会通不过编译,如下图,用老方法就没这个规定)。如果要把CTE递归返回的结果要和旧的一样line显示层次结构、sid显示物料层次,那还要用Convert把line和sid在递归部分给改上,如果再用Convert,那CTE会不会更慢?我也懒得试了
http://files.iyunv.com/elzero/images/08090402.jpg
  从执行时间看453和8530根本不在同等级,不知道是不是我CTE的用法不对,还是什么原因,因为我想MS不会出现这样低级的错误吧,望各位sql牛人指教

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82761-1-1.html 上篇帖子: sql server 还原数据库时提示:数据库正在使用,无法进行操作的解决方法2 下篇帖子: SQL Server 2005 中新CTE语法 递归性能测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表