select a.rkno,a.packageno,a.type as hi_no,a.cust_no,b.lotno,count(b.lotno)mount,
convert(varchar(10),a.date,120)date from rk_log as a inner join 
dfl_detail as b on a.packageno = b.packageno where 
a.rkno like '%%' and a.cust_no like '%310F63TS1A%' and b.lotno like '%%' 
and a.date >= '2014-12-01' and a.date <= '2014-12-11' 
group by a.rkno,a.packageno,a.type,a.cust_no,b.lotno,convert(varchar(10),a.date,120) 
order by date asc什么意思?

解决方案 »

  1.   


    查询的条件可能为空,所以用like查询。
      

  2.   

    like '%xxxxx'这种格式用不到索引,准确来说索引性能非常低效。数据量很大的话,建议使用全文检索或者第三方全文搜索工具。
      

  3.   

    a.rkno like '%%' and a.cust_no like '%310F63TS1A%' and b.lotno like '%%' 
    改为
    a.cust_no like '%310F63TS1A%'  
    试试
      

  4.   

    就是说如果单是sql查询没有办法了?
      

  5.   

    a.cust_no like '%310F63TS1A%' -->这个是全匹配,没有办法优化
      

  6.   

    纯SQL来看,除了我1楼红字部分之外,一般没有多大问题,如果非要说有,那么就是日期列是否有索引,是否数据类型隐式转换
      

  7.   

    问题是这样同样耗时7秒,说明下dfl_detail是视图。select a.rkno,a.packageno,a.type as hi_no,a.cust_no,b.lotno,count(b.lotno)mount,
    convert(varchar(10),a.date,120)date from rk_log as a left join 
    dfl_detail as b on a.packageno = b.packageno where 
    a.cust_no = '310F63TS1A'
    and a.date >= '2014-12-01' and a.date <= '2014-12-11' 
    group by a.rkno,a.packageno,a.type,a.cust_no,b.lotno,convert(varchar(10),a.date,120) 
    order by date asc
      

  8.   

    a.rkno like '%%' and a.cust_no like '%310F63TS1A%' and b.lotno like '%%' 
    order by date asc
    1)明确你的数据定义,是否可换为:
    a.cust_no like '310F63TS1A%' and b.lotno like '%'  and a.rkno like '%'

    a.cust_no like '310F63TS1A%' and b.lotno like (case when isnull(XXX,'')='' then '%' else 'XXX%' end  )
                                                            and a.rkno  like (case when isnull(XXX,'')='' then '%' else 'XXX%' end  )
    2)一般数据处理,是不需要order by date asc的
    3)看执行计划,想办法利用上索引。
      

  9.   

    原因找到了,问题出在a.date上,最终结果:
    select a.rkno,a.packageno,a.type,a.cust_no,b.lotno,count(b.lotno)mount from rk_log as a left join 
    dfl_detail as b on a.packageno = b.packageno where 
    a.cust_no = '310F63TS1A'
    and convert(varchar(10),a.date,120) >= '2014-12-01' and convert(varchar(10),a.date,120) <= '2014-12-11' 
    group by a.rkno,a.packageno,a.type,a.cust_no,b.lotno,convert(varchar(10),a.date,120) 
    order by convert(varchar(10),a.date,120) asc
      

  10.   

    隐式转换。但是你这样会导致a.date上的索引无效,可以考虑换成这样:
    a.date between '2014-12-01 00:00:00.000' and '2014-12-11 23:59:59.997'