今天看到一条用函数处理连接的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结合使用: 这将给我以下响应: `` 问题答案: 通过运行以下命令验证映射是否已真正设置: 创建索引的命令似