热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在保持逻辑的同时进行JOIN子查询-SubqueriestoJOINwhilekeepinglogic

ImtryingtooptimizeaslowqueryandIvecomeacrossthefollowing(runningconsistentlyover8

I'm trying to optimize a slow query and I've come across the following (running consistently over 8 seconds).

我正在尝试优化慢速查询,我遇到了以下情况(持续运行超过8秒)。

SELECT entryID, entryID AS iE, 0 AS eE, 'clarus1' AS locationID, dateStamp, amount AS income, NULL AS expense, reconciled, leaseID AS vendorID, incomeID AS expenseID
FROM structu_income.iLedger 
WHERE (dateStamp BETWEEN '2009-04-16' AND '2012-02-29') AND incomeID IS NOT NULL
    AND (
        leaseID IN (
            SELECT lease.leaseID FROM structu_assets.lease WHERE lease.unitID IN (
                SELECT unit.unitID FROM structu_assets.unit WHERE unit.locatiOnID= 'clarus1'
            )
        )
        OR locationID IN (SELECT locationID FROM structu_assets.deed WHERE ownerID = 'clarus')
    )

Here's the EXPLAIN:

这是EXPLAIN:

enter image description here

My thought was to refactor the subqueries to use JOIN. But keeping the logical OR is throwing me off.

我的想法是重构子查询以使用JOIN。但保持合乎逻辑的OR会让我失望。

In addition, the nested subqueries seem inevitable. Unless I predetermined the unitID in a separate query.

此外,嵌套的子查询似乎是不可避免的。除非我在单独的查询中预先确定unitID。

I'm not the original developer. But I'm charged with making it more performant without modifying the existing codebase or schema. So I'm attempting the pick off the slow queries.

我不是原来的开发者。但是我负责在不修改现有代码库或架构的情况下使其更高性能。所以我正在尝试挑选慢速查询。

As an aside, do cross database queries take a performance hit?

另外,交叉数据库查询是否会受到性能影响?

2 个解决方案

#1


1  

add an index to your dateStamp column.

在dateStamp列中添加索引。

use :

dateStamp > '2009-04-16' AND dateStamp <'2012-02-29'

instead of :

代替 :

dateStamp BETWEEN '2009-04-16' AND '2012-02-29'

it's more efficient.

它效率更高。

Finally, you can write a loop in PHP instead of subqueries.

最后,您可以在PHP中编写循环而不是子查询。

#2


1  

It would be interesting to see if this answer a) works and b) is faster. Try this:

看看这个答案a)是否有效以及b)是否更快将会很有趣。尝试这个:

SELECT
    il.entryID,
    il.entryID AS iE,
    0 AS eE,
    'clarus1' AS locationID,
    il.dateStamp,
    il.amount AS income,
    NULL AS expense,
    il.reconciled,
    il.leaseID AS vendorID,
    il.incomeID AS expenseID
FROM
    structu_income.iLedger il
    INNER JOIN structu_assets.lease l ON il.leaseID = l.leaseID
    INNER JOIN structu_assets.unit u ON l.unitID = u.unitID AND u.locatiOnID= 'clarus1'
WHERE
    il.dateStamp BETWEEN '2009-04-16' AND '2012-02-29'
    AND il.incomeID IS NOT NULL
UNION
SELECT
    il.entryID,
    il.entryID AS iE,
    0 AS eE,
    'clarus1' AS locationID,
    il.dateStamp,
    il.amount AS income,
    NULL AS expense,
    il.reconciled,
    il.leaseID AS vendorID,
    il.incomeID AS expenseID
FROM
    structu_income.iLedger il
    INNER JOIN structu_assets.deed d ON il.locatiOnID= d.locationID AND d.ownerID = 'clarus'
WHERE
    il.dateStamp BETWEEN '2009-04-16' AND '2012-02-29'
    AND il.incomeID IS NOT NULL

The first SELECT query takes care of the first half of your OR conditions, and the second SELECT query adds in the results for the second half. And you shouldn't get duplicate rows with UNION so I believe you should get the same results.

第一个SELECT查询负责OR条件的前半部分,第二个SELECT查询添加后半部分的结果。你不应该用UNION获得重复的行,所以我相信你应该得到相同的结果。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
半邪书生66_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有