SQL字段拆分优化

   2015-10-10 0
核心提示:sql优化做的好,对程序的运行速度有很大的帮助,本篇文章给大家介绍sql字段拆分优化,需要的朋友一起来学习吧。

今天看到一条用函数处理连接的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字段拆分优化

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Oracle分页SQL优化 分页查询sql语句优化
    一、分页框架1.正确的分页框架select * from (select * from (select a.*,rownum rn from (需要分页的SQL) a )where rownum =10)where rn =1;2.错误的分页框架select *from (select t.* ,rownum rn from (需要分页的SQL) t )where rn =1 and rn =10;采用错
    02-10
  • MySQL架构优化实战系列4:SQL优化步骤与常用管理命令
  • Oracle 表三种连接方式(sql优化)
    转自网络1. NESTED LOOP对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就依据索引去还有一个表里面查找,没有索引一般就不会是 nested loops。一般在nested loop中, 驱动表满足条件结果集不
    02-10
  • (MYSQL)SQL优化工具 - SQLAdvisor 安装使用详解
    一、SQLAdvisor简介  SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具。它基于MySQL原生态词法解析,结合分析SQL中的where条件、聚合条件、多表Join关系 给出索引优化建议。目前SQLAdvisor在美团点评广
    02-10
  • oracle 中sql优化的几种方法
    oracle 中sql优化的几种方法
    最基本最简单的方式是减少访问数据库的次数。oracle在内部执行了许多工作,比如解析SQL语句, 估算索引的利用率,  读数据块等等,都将大量耗费oracle数据库的运行。 选择最有效率的表名顺序,也将明显提升oracle的性能。 oracle解析器是按照从右到左的顺序
    02-09
  • MYSQL之sql优化——慢查询日志 mysql 查询变慢
    1.在进行sql优化之前,首先我们得找到需要优化的sql(比如查询时间超过2s的慢sql),这时候我们就要使用到慢查询日志(慢sql的挖掘机);2.慢查询日志:  MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指
    02-09
  • SQL优化神器 - Tosska SQL Tuning Expert Pro for Oracle
    SQL优化神器 - Tosska SQL Tuning Expert Pro f
     SQL Tuning Expert Pro for Oracle 是Tosska 公司推出的划时代SQL优化工具。它可以帮助SQL开发人员和DBA:    找到最快的等价SQL;    调整执行计划;    管理SQL的执行计划;    创建全局最优的索引组合。 官网下载: https://www.tosska.cn/toss
    02-09
  • Oracle的SQL优化思路 oracle数据库sql语句优化
    Oracle的SQL优化思路 oracle数据库sql语句优化
    个人总结SQL脚本优化,大体如下:(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表dirving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选
    02-09
  • Oracle 表三种连接方式(sql优化)
    在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理。一、连接方式:嵌套循环(Nested Loops (NL))(散列)哈希连接(Hash Join (HJ))(归并)排序合并连接(Sort Merge Join (SMJ)
    02-09
  • 如何进行mysql的优化
    这篇文章主要介绍了如何进行mysql的优化,其实脚本之家之前就分享了很多的相关资料,需要的朋友可以参考下
    05-18 mysql优化
点击排行