如何优化带有重复子查询的大查询

2023-12-24

我有以下包含重复子查询的巨大查询,它对我来说看起来效率很低。我该如何优化它?

SELECT T2.date1, T2.date2, T2.period, T1.market, T1.ticker, 0 AS scenario
FROM
(SELECT  DISTINCT
        Q.market AS market,
        Q.ticker AS ticker

FROM portfolio.scenario S RIGHT JOIN portfolio.quote Q
ON    S.series =  (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1) AND
      Q.market = S.market AND 
      Q.ticker = S.ticker

WHERE  Q.date = '2010-07-01' AND
       S.date1 IS NULL) AS T1

JOIN 

(SELECT DISTINCT S.date1, S.date2, S.period
FROM scenario S
WHERE S.series = (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1) AND
      S.date1 >= '2009-09-01' AND
      S.date2 <= '2010-07-01') AS T2

UNION

SELECT  S.date1 AS date1, 
        S.date2 AS date2,
        S.period AS period,
        Q.market AS market,
        Q.ticker AS ticker,
        Q.close * EXP(S.ratio) AS scenario

FROM portfolio.scenario S , portfolio.quote Q

WHERE  S.series = (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1) AND
      S.date1 >= '2009-09-01' AND
      S.date2 <= '2010-07-01' AND
      Q.date = '2010-07-01' AND
      Q.market = S.market AND 
      Q.ticker = S.ticker

UNION

SELECT T2.date1, T2.date2, T2.period, T1.market, T1.ticker, 0 AS scenario
FROM
(SELECT  DISTINCT
        Q.market AS market,
        Q.ticker AS ticker

        FROM portfolio.scenario S , portfolio.quote Q
        WHERE  Q.date = '2010-07-01' AND
              Q.market = S.market AND 
              Q.ticker = S.ticker AND
              S.series = (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1) AND
              S.date1 >= '2009-09-01' AND
              S.date2 <= '2010-07-01' ) AS T1

JOIN 

(SELECT DISTINCT S.date1, S.date2, S.period
FROM scenario S
WHERE S.series = (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1) AND
      S.date1 >= '2009-09-01' AND
      S.date2 <= '2010-07-01') AS T2


WHERE (T2.date1, T2.date2, T2.period, T1.market, T1.ticker)
        NOT IN (SELECT  S.date1 AS date1, 
                S.date2 AS date2,
                S.period AS period,
                Q.market AS market,
                Q.ticker AS ticker

        FROM portfolio.scenario S , portfolio.quote Q
        WHERE  Q.date = '2010-07-01' AND
              Q.market = S.market AND 
              Q.ticker = S.ticker AND
              S.series = (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1) AND
              S.date1 >= '2009-09-01' AND
              S.date2 <= '2010-07-01' )


ORDER BY 
date1,date2,period,market,ticker

After @Bruce https://stackoverflow.com/users/99003/bruce-alderson的评论和一些减少子查询的逻辑我现在的查询是:

(SELECT S.date1, 
        S.date2,
        S.period,
        Q.market,
        Q.ticker,
        Q.close * EXP(S.ratio) AS scenario

FROM portfolio.scenario S , portfolio.quote Q

WHERE  
      S.date1 >= (@date1 := '2009-09-01') AND
      S.date2 <= (@date2 := '2010-07-01') AND
      Q.date = (@qdate := '2010-07-01') AND
      S.series = 
      (@series := 
                  (SELECT S.series
                  FROM scenario S
                  WHERE S.date1 >= '2009-09-01' AND
                        S.date2 <= '2010-07-01' AND
                        S.period = 'QUARTER'
                  ORDER BY S.date2
                  LIMIT 1)) AND
      Q.market = S.market AND 
      Q.ticker = S.ticker)

UNION

(SELECT T2.date1, T2.date2, T2.period, T1.market, T1.ticker, 0 AS scenario
FROM
(SELECT Q.market, Q.ticker
 FROM quote Q
 WHERE Q.date = @qdate) AS T1

JOIN 

(SELECT DISTINCT S.date1, S.date2, S.period
FROM scenario S
WHERE S.series = @series AND
      S.date1 >= @date1 AND
      S.date2 <= @date2) AS T2

WHERE (T2.date1, T2.date2, T2.period, T1.market, T1.ticker)
        NOT IN 

        (SELECT  S.date1,
                 S.date2,
                 S.period,
                 Q.market,
                 Q.ticker
        FROM portfolio.scenario S , portfolio.quote Q
        WHERE  Q.date = @qdate AND
               Q.market = S.market AND 
               Q.ticker = S.ticker AND
               S.series = @series AND
               S.date1 >= @date1 AND
               S.date2 <= @date2 ))

但是,如果我改变了

  (@series := 
              (SELECT S.series
              FROM scenario S
              WHERE S.date1 >= '2009-09-01' AND
                    S.date2 <= '2010-07-01' AND
                    S.period = 'QUARTER'
              ORDER BY S.date2
              LIMIT 1))

to be

  (@series := 
              (SELECT S.series
              FROM scenario S
              WHERE S.date1 >= @date1 AND
                    S.date2 <= @date2 AND
                    S.period = 'QUARTER'
              ORDER BY S.date2
              LIMIT 1))

处理它需要太多时间(我已经执行了10分钟前的查询,但仍然没有得到结果),而查询通常会在5秒内返回。

此外,当我重置变量时,执行结果不正确(可能使用上次执行中的变量值)。我如何在不添加 SET 语句的情况下更改它(我希望它是单个查询)


使用 MySQL 变量:

SELECT
    @x := ColumnName,
    @y := ColumnName2 + @z,
    @z := (SELECT * FROM SubTable WHERE x = @x),
    (SELECT * FROM Table2 WHERE X = @z),
    (SELECT * FROM Table3 WHERE X = @z)
FROM Table
WHERE
    v = @v
  • 您可以将子选择和列值分配给 SQL 变量
  • 您可以在语句中的任何位置引用这些变量
  • 变量包含前一行的值(如果设置)
  • 您可以通过这种方式重用子选择和其他值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优化带有重复子查询的大查询 的相关文章

  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 在MySQL中生成随机字符串

    我正在尝试使用函数在 phpmyadmin 中获取随机字符串 我有以下代码 CREATE FUNCTION randomPassword RETURNS varchar 128 BEGIN SET chars ABCDEFGHIJKLMNO
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 无法在 Zend Framework 中回滚事务

    我在 Zend Framework 中使用以下代码进行事务 但回滚功能不起作用 数据通过 insertSome data 插入数据库 怎么了 db gt beginTransaction try model gt insertSome da
  • pymssql 库中的参数绑定是否正确实现?

    我使用 pymsqsql 库从 Python 程序调用极其简单的查询 with self conn cursor as cursor cursor execute select extra id from mytable where id
  • Mysql带限制的删除语句

    我试图从表中删除行 但出现错误 DELETE FROM chat messages ORDER BY timestamp DESC LIMIT 20 50 我在 50 时收到此错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • 如何为 MySQL 中的字段或列添加别名?

    我正在尝试做这样的事情 但我收到未知的列错误 SELECT SUM field1 field2 AS col1 col1 field3 AS col3 from core 基本上 我只想使用别名 这样我就不需要执行之前执行的操作 这在mys
  • CakePHP 查找 - 按字符串到整数排序?

    我想使用 CakePHP 从数据库中提取照片数组 按照片标题排序 0 1 2 3 我的查询当前看起来像 ss photos this gt Asset gt find all array conditions gt array kind g
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 条件触发器的Django迁移sql

    我想创建一个触发器 仅在满足条件时插入表 我尝试过使用 IF BEGIN END 和 WHERE 的各种组合 但 Django 每次都会返回 SQL 语法错误 这里 type user id指的是触发该事件的人 user id指的是接收到通
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的

随机推荐

  • 按值对多维哈希进行排序并打印最高的

    我有一个存储的多维哈希 info 具有以下结构 info os id length foreach os keys info foreach id keys info os print os id gt info os id n if ke
  • 常量截断为整数

    下面的GO程序会报错 fft go 13 constant 6 28319 truncated to integer fft go 13 cannot use 7 k N type int as type float64 in assign
  • 如何在 php 中创建我的网站的日志文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想知道如何用 php 创建我的网站
  • UICollectionView 对陈旧数据的断言错误

    在尝试从我的集合视图中卸载一批图像 然后用另一批图像替换它们的过程中 我遇到了一个错误 其中 根据原始图像组或后续图像组是大于还是小于预期的替换图像 发生断言错误 表示 Assertion failure in UICollectionVi
  • CUDA 中的全局内存与共享内存

    我有两个 CUDA 内核可以计算类似的东西 一种是使用全局内存 myfun是一个设备函数 它从全局内存中读取大量数据并进行计算 第二个内核将该数据块从全局内存传输到共享内存 以便数据可以在块的不同线程之间共享 我使用全局内存的内核比使用共享
  • 从精明的边缘获取边界并删除图像的背景

    我正在尝试删除我正在尝试训练神经网络的图像的背景 我使用此处描述的方法运气不佳 如何从此类图像中删除背景 https stackoverflow com questions 29313667 how do i remove the back
  • 如何在 Bootstrap 模态中显示画布

    我创建了一个地图 您可以在其中通过 Javascript 预订自行车 用户应该 1 选择一个自行车站 绿色站 可以使用自行车 2 点击一个按钮 预留按钮 3 登录画布 在模式中 页面在这里 http p4547 phpnet org bik
  • 将 Android 手机中的图像和视频获取到自定义图库中

    我正在尝试创建一个自定义图库 允许用户从其 Android 设备上包含的所有照片和视频中进行挑选 我知道如何创建仅包含照片和视频的图库 但如果我想将两者结合起来 我该怎么做 我认为问题归结于我如何创建光标 为了选择所有视频 我这样创建了光标
  • 如何将数据从隔离作用域传递到父作用域?

    我对使用 AngularJS 相当陌生 我想做的是创建一个指令并从其中的父作用域调用函数 我能够完成此任务 但我似乎无法弄清楚如何通过表达式将数据从隔离范围传递到父范围 Angular 开发者指南中对此的解释有点令人困惑 该指令 app d
  • Nodemon - 排除文件

    我想从 NodeMon 的监控中排除一些特定文件 我怎样才能做到这一点 我现有的配置 nodemon all script app js options watchedExtensions js 为了让 NodeMon 忽略监控中的一堆文件
  • 使用 jQuery 以编程方式单击 链接

    我知道这个问题以前曾被问过 但在网上搜索后我似乎找不到直接的答案 the HTML a href index php jQuery 这两个都不起作用 myAnchor click or myAnchor trigger click 实现这一
  • 使用 SlimDX 设置常量缓冲区

    我一直在关注 Microsoft Direct3D11 教程 但使用 C 和 SlimDX 我正在尝试设置常量缓冲区 但不确定如何创建或设置它 我只是尝试使用常量缓冲区设置三个矩阵 世界 视图和投影 但我在每个阶段 创建 数据输入并将其传递
  • 从 C# 以编程方式创建 Excel VBA 代码和按钮

    我正在使用简单的方法 该方法将我的 DataGridView 保存到 Excel 文档 仅 1 个工作表 中 并添加 VBA 代码和一个用于运行 VBA 代码的按钮 public void SaveFile string filePath
  • Windows Phone 8.1 DatePicker 中无法将类型“%0”的实例添加到类型“%1”的集合中

    嘿 我正在使用 MVVM 模式在 Windows Phone 8 1 中开发一个应用程序 我想从以下位置获取日期日期选择器 on the 日期更改事件在视图模型中 运行程序后我收到此错误 App1 exe WinRT 中第一次出现 Wind
  • 如何在java中获取给定的日期字符串格式(模式)?

    我想获取给定日期字符串的格式 示例 我有一个像这样的字符串2011 09 27T07 04 21 97 05 00该字符串的日期格式是yyyy MM dd T HH mm ss SSS 这里我想在传递 string 2011 09 27T0
  • 在许可证页面上添加复选框和单选按钮

    我正在 Nsis 中编写脚本 我需要在许可证页面上有选项单选按钮以及用于再次确认的复选框 是否可以这样做 因为如果我尝试插入较高优先级的是复选框 而我缺少单选按钮 最好我想只修改许可证页面而不创建自定义页面 感谢您的帮助 选项A 使用修改后
  • 为什么它对造型无懈可击?

    我只想将其颜色更改为 DD4814 但我不能 顺便说一句 这是一个 分享按钮 可能是什么原因 span class st sharethis span
  • 如何更改笔记本 Rmarkdown 中的 dpi 内联代码输出

    我知道在将 rmarkdown 笔记本编织为 html 时如何更改绘图的 dpi 但是 有没有一种方法可以更改 rmarkdown 笔记本中生成的绘图的 dpi 而无需编织文档 即在处理笔记本时绘图显示为两个代码块之间的内联输出 None
  • 有调试生产功能程序的实际经验吗?

    我感兴趣的是使用哪些工具和方法来诊断大型功能程序中的缺陷 有哪些工具有用 我目前的理解是 printf 调试 例如添加日志记录和重新部署 是通常使用的 如果您已经调试过一个功能系统 那么它与调试使用 OO 或过程语言构建的系统有何不同 Sa
  • 如何优化带有重复子查询的大查询

    我有以下包含重复子查询的巨大查询 它对我来说看起来效率很低 我该如何优化它 SELECT T2 date1 T2 date2 T2 period T1 market T1 ticker 0 AS scenario FROM SELECT D