当前位置: 移动技术网 > IT编程>数据库>MSSQL > SQL字段拆分优化

SQL字段拆分优化

2017年12月12日  | 移动技术网IT编程  | 我要评论

韩国女主播门,伊丽莎白镇高清下载,邯郸人才招聘网有职

今天看到一条用函数处理连接的sql,是群里某位网友的,sql语句如下:

select so_order.fdate ,
  so_order.fsn
from so_order
  inner join so_orderitem on charindex(so_orderitem.fid, so_order.fid) >= 1
where so_order.forderdate = '2015-09-06'

语句不算复杂,只是执行比较慢,下面是关于这sql语句的一些信息:

--1.sql执行203条数据

--2.耗时12秒

--3.so_order表的fid字段是字符串集合,

--由1-2个字符串组成,用','分隔

select count(*)
from so_order
where so_order.forderdate = '2015-09-06'--24
select count(*)
from so_orderitem--414154

  通过分析执行计划,so_order和so_orderitem走嵌套循环是正确的,查询的瓶颈是在so_orderitem的索引

扫描上。因此,我们要通过改写sql,达到so_orderitem走索引查找的目的。

  将so_order表的fid字段拆分成2个字段,然后union all成一个结果集,再和so_orderitem关联,即可让so_orderitem表走索引查找。

改写的sql如下:

;with x0
   as ( select fdate ,
      fsn ,
      left(fid, case when charindex(',', fid, 1) = 0 then 0
          else charindex(',', fid, 1) - 1
         end) as fid
    from  so_order
    where forderdate = '2015-09-06'
    union all
    select fdate ,
      fsn ,
      right(fid, len(fid) - charindex(',', fid, 1)) as fid
    from  so_order
    where forderdate = '2015-09-06'
    )
 select so_order.fdate ,
   so_order.fsn
 from x0 so_order
   inner join so_orderitem on so_orderitem.fid = so_order.fid

  下面是sql改写后,网友的反馈截图

  改写后sql的执行计划如下:


如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网