none
谁能帮忙优化一下这个sql语句 RRS feed

  • 问题

  • select distinct
     e.account as account,
     e.so_no as so_no,
     e.cbm as cbm,
     substring(convert(varchar,e.rec_date,120),0,17)as rec_date,
     f.clpno as clpno ,
     substring(convert(varchar,g.stuffstart,120),0,17)as stuffstart,
     DATEDIFF(dd,e.rec_date,g.stuffstart)as TurnOverDay
    from (select DISTINCT 
    rh.account,
    rh.so_no,
    rd.rec_date,
    sum((rd.length*rd.width*rd.height*rd.ctns)/1000000)as cbm
    from
    rechead rh inner join recdtl rd on rd.so_no =rh.so_no where rec_date>='2011-06-01' and rec_date < '2011-07-01'
    and rh.account like '%wal%' group by rh.account, rh.so_no,rd.rec_date) as e left join outdtl f on e.so_no= f.so_no left join outhead g on f.clpno=g.clpno

     

     

    2011年7月2日 8:35

答案

全部回复

  • select distinct 
    e.account as account,
    e.so_no as so_no,
    e.cbm as cbm,
    --substring(convert(varchar,e.rec_date,120),0,17) as rec_date,
    --转成120格式,前17位,直接这样既可
    convert(varchar(16),e.rec_date,120) as rec_date
    f.clpno as clpno ,
    --substring(convert(varchar,g.stuffstart,120),0,17)as stuffstart,
    convert(varchar(16),g.stuffstart,120) as stuffstart
    datediff(dd,e.rec_date,g.stuffstart)as TurnOverDay 
    from (select --已经根据三个字段group by 了,不需要再distinct了 
    rh.account, 
    rh.so_no,
    rd.rec_date,
    sum((rd.length*rd.width*rd.height*rd.ctns)/1000000)as cbm 
    from rechead rh inner join recdtl rd 
    on rd.so_no =rh.so_no 
    where rec_date>='2011-06-01' and rec_date < '2011-07-01'
    and rh.account like '%wal%' 
    group by rh.account, rh.so_no,rd.rec_date) as e 
    left join outdtl f on e.so_no= f.so_no 
    left join outhead g on f.clpno=g.clpno
    

    2011年7月3日 7:18
    版主
  • 你好,

    根据的语句,需要补充一点。当我们使用Like 语句时候,类似like '%wal%' ,此时你可以查看你的执行计划,是INDEX SCAN,而不是INDEX SEEK。我建议你修改为:like 'wal%'。
    当然我们也可以用全文索引,关于创建全文索引,请参阅:
    CREATE FULLTEXT INDEX (Transact-SQL)
    http://msdn.microsoft.com/zh-cn/library/ms187317.aspx


    谢谢,
    邱爱华


    Ai-hua Qiu
    2011年7月4日 2:54
  • --substring(convert(varchar,e.rec_date,120),0,17) as rec_date,
    --转成120格式,前17位,直接这样既可
    这个不是和我的一样吗?不懂。

    邱先生:能问一下你INDEX SCAN 和INDEX SEEK 这两个的不同处在那里,在运行中它们各自的优势是什么

    2011年7月5日 2:07
  • Generally speaking, index seek costs less than index scan. But in real world, it depends on number of rows returned by the query.
    2011年7月5日 2:39