当前位置: 首页 > 编程笔记 >

SQL字段拆分优化

夏博
2023-03-14
本文向大家介绍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

  通过分析执行计划,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的执行计划如下:


 类似资料:
  • 问题内容: 我有一个Access 2013数据库表dbo_GOV 目标 我要使用USSenators字段,该字段包含类似(如下)的数据,并将其分别分为USSenator1和USSenator2字段: 问题 我尝试了几种不同的Access SQL查询…(在执行时都在下面),给出错误消息 无效使用’。’,’!’或’()’。在查询表达式’Split(USSenators&“;”,’;’)(0’中。 我已

  • 问题内容: 我的一个同事在处理COBOL程序时遇到了此问题,并最终在应用程序级别解决了该问题。我仍然很好奇,是否有可能使用SQL在数据访问级别上解决它。这在某种程度上与另一个问题有关,但是我只想使用ANSI SQL。 我正在寻找一个对包含可变长度CSV行的VARCHAR字段起作用的SQL选择查询。该查询的目的是在其自己的结果集行中拆分每个CSV字段。 这是一个带有模式和数据的示例 这是我想从查询中

  • 问题内容: 我目前在一个表格列中有char值,其格式为“ IS-”,然后是1到5个数字,可能的句点可以是2个数字,也可以是一个字母。 示例为IS-1,IS-12,IS-123,IS-123.11,IS-123.a。 我需要分割字符串,以便仅抓取数字部分,对字符串ASC进行排序,然后将字符串重新组合在一起。 解释。我有以下一组值,如您所见,因为IS-1在IS-8之前,所以它们按数字顺序排序。 知道从

  • 问题 你想拆分一个字符串。 解决方案 使用 JavaScript 字符串的 split() 方法: "foo bar baz".split " " # => [ 'foo', 'bar', 'baz' ] 讨论 String 的这个 split() 方法是标准的 JavaScript 方法。可以用来基于任何分隔符——包括正则表达式来拆分字符串。这个方法还可以接受第二个参数,用于指定返回的子字符串数

  • 问题内容: 我有一个表字段,其中包含用户的姓氏和名字。是否有可能分裂成那些2场,? 所有记录的格式均为“名字的姓氏”(不带引号,中间还有空格)。 问题答案: 不幸的是,MySQL没有分割字符串功能。但是,您可以为此创建一个用户定义的函数,例如以下文章中描述的函数: Federico Cargnelutti撰写的MySQL Split String Function 使用该功能: 您将可以按照以下方

  • 问题内容: 我的映射定义中包含以下字段: 当我索引用的有价票证该值被分成3个术语:,,。 我究竟做错了什么? 我创建了以下索引: 然后我索引以下文档: 然后,我将插件https://github.com/jprante/elasticsearch-index- termlist 与以下API结合使用: 这将给我以下响应: `` 问题答案: 通过运行以下命令验证映射是否已真正设置: 创建索引的命令似