欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL字段拆分优化

程序员文章站 2024-01-12 08:20:22
今天看到一条用函数处理连接的sql,是群里某位网友的,sql语句如下: select so_order.fdate , so_order.fsn from...

今天看到一条用函数处理连接的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

SQL字段拆分优化

  通过分析执行计划,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字段拆分优化

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

SQL字段拆分优化