热门标签 | 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获得重复的行,所以我相信你应该得到相同的结果。


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
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社区 版权所有