none
谁帮我优化一下这个存储过程 RRS feed

  • 问题

  • Shipment Table有点大


    declare @MonthEnd as int
    declare @Plantlist as varchar(200)
    Declare @NB as varchar(20)
    declare @DT as varchar(20)
    declare @CA1 as varchar(10)
    declare @CA2 as varchar(10)
    declare @sql varchar(8000)
    declare @SubSQL varchar(8000)
    declare @OriginDay varchar(10)

    if @plant='HP'
     begin
      set @Plantlist='''HPSZ'',''HPCD'''
      set @NB='''HPNB'''
      set @DT='''Desktop-HP'''
     end
    else if @plant='ACER'
     begin 
      sET @Plantlist='''ACERSZ'''
      set @NB='''ACERNB'''
      set @DT='''Desktop-ACER'''
     end
    else
     begin
      set @NB='''Mobile'''
      set @DT='''Desktop'''
     end

    --set @plant='''' + replace(@plant,',',''',''') + ''''
    set @OriginDay=@Todays
    -- Sara 通知 2011-01 修改月底时间
    IF @todays<'2010-12-28'
     set @MonthEnd=-5
    ELSE
     set @MonthEnd=-7

    set @CA2 = convert(varchar(10),dateadd(dd,@MonthEnd+1,dateadd(ms,-3,dateadd(mm,datediff(m,0,@Todays)+month(@Todays)-month(@Todays)+1,0))),21)
    set @Todays=convert(varchar(10),case when datediff(dd,@Todays,@ca2)<0 then dateadd(mm,1,@todays) else @todays end,21)

    set @CA1 = convert(varchar(10),dateadd(dd,@MonthEnd+2,dateadd(ms,-3,dateadd(mm,datediff(m,0,@Todays)+month(@Todays)-month(@Todays),0))),21)
    set @CA2 = convert(varchar(10),dateadd(dd,@MonthEnd+1,dateadd(ms,-3,dateadd(mm,datediff(m,0,@Todays)+month(@Todays)-month(@Todays)+1,0))),21)

    IF @todays>='2010-12-28' and @todays<='2011-01-25'
     begin
      Set @CA1='2010-12-28'
      SET @CA2='2011-01-25'
     end

    set @SubSQL='select Sort,geo,mg1,sum(case when [plant gi date]=''' + @OriginDay +''' then [ship-qty] else 0 end) JinTian,sum([ship-qty]) MTD from (select mg1sdr_sort Sort,case when route=''C6R4L2'' and cty=''FI'' then ''RuCis'' when route=''C6DEB2'' and cty=''CZ'' then ''WE'' else sdrgeo END geo,case when family =''Kuril 3G'' or family =''dover'' or family =''push'' then ''Ipad'' when family=''Thunderbay'' then ''Desktop-ECS'' else case when MG1sdr =''Mobile'' then ' + @NB + ' when MG1sdr=''Desktop'' then ' + @DT + ' else MG1sdr end END mg1,[plant gi date],[ship-qty] from shipmentdata s left join setup p on mg1=mg1code left join [country code] p1 on cty=[2-digit code] where ([order type]<>''yco2'' or [order type] is null) and plant in ('+@plantLIST+') and [plant gi date]>=''' + @CA1 + ''' and [plant gi date]<=''' + @OriginDay + ''' and [plant gi date]<=''' + @CA2 + ''' ) T1 group by geo,mg1,left(convert(varchar,[plant gi date],112),6),sort'
    set @sql = 'select case sort when ''NB'' THEN 1 when ''DT'' THEN 2 else 3 end mIndex,case when (grouping(mg1)=1) then case when sort is null then ''Total'' else  + Sort + '' Sub-Total'' end else isnull(mg1,''Unknown'') end Item'
    select @sql = @sql + ',Convert(varchar,sum(case geo when ''' + geo + ''' then [JinTian] else 0 end)) [JT_' + geo + ']' +
         ',Convert(varchar,sum(case geo when ''' + geo + ''' then [MTD] else 0 end)) [MTD_' + geo + ']'
    from (select distinct replace([sdrgeo],' ','_') geo from [country code] where sdrgeo is not null) as a order by geo
    set @sql = @sql + ' from (' + @SubSQL + ') t group by sort,mg1 with rollup order by mindex'

    exec(@sql)

    END


    不吝赐教
    2011年3月18日 6:29

答案

  • 呵呵,这个语句没有问题,可以正常执行,其实也不慢,,,只是还想更快

    我用的就是参数,,,然后动态产生的语句,,,用exec来执行的

     


    不吝赐教
    • 已标记为答案 kyle.cj 2012年4月27日 1:18
    2011年3月22日 1:50

全部回复

  • 看得眼花,也不知道plant gi date 一次查询多少,是否有合适的索引
    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2011年3月18日 6:58
  • Did you check execution plan?
    2011年3月18日 16:12
  • 就这动态语句还查看执行计划呢?

     

    建议楼主尽量参数化,使用sp_executesql来执行。将那些变量作为参数传进去,至少看代码也容易些。这么一堆字符串拼起来,想看懂还真不太容易。

    2011年3月19日 3:01
  • 呵呵,这个语句没有问题,可以正常执行,其实也不慢,,,只是还想更快

    我用的就是参数,,,然后动态产生的语句,,,用exec来执行的

     


    不吝赐教
    • 已标记为答案 kyle.cj 2012年4月27日 1:18
    2011年3月22日 1:50
  • 语句太乱,我描述一下我的应用,,,帮助理解了,呵呵

    我接受二个参数Plant和Todays

    @Plant参数简单,就是定义哪一个工厂。。。@Todays的做用是判断Todays是哪个月,以获取 >=这个月初 and <=Todays and <=这个月底 的Shipment数据,这是一个Month to day的数据

     


    不吝赐教
    2011年3月22日 1:55