带有子查询的 SQL 查询缓慢

Posted

技术标签:

【中文标题】带有子查询的 SQL 查询缓慢【英文标题】:Slowness in SQL query with subquery 【发布时间】:2021-02-27 18:50:47 【问题描述】:

当在 WHERE 子句中添加子查询时,即使查询的单个运行时间少于 1 分钟,我的 SQL 查询也会变得太慢。 该查询具有以下骨架

SELECT COL1, COL2, COL3, COL4, COL5, COL6, sum(COL7) FROM TABLE1 
WHERE Col1 = 'something' AND COl2 = date AND Col3 = (SELECT MAX(COLUMN1) FROM TABLE2)
GROUP BY COL1, COL2, COL3, COL4, COL5, COL6 

此查询正在 SYBASE IQ 上运行。

表 1 的数据是 60M+ 行,应用过滤条件后只有 60 行,如果将子查询替换为硬编码值,通常需要 50 秒才能运行。

表 2 的数据为 200 行,应用过滤条件后只是一个整数值,单独运行需要 1 秒。

【问题讨论】:

代码语法不正确。 WHERE 子句没有逗号。示例数据、期望的结果以及对查询应该做什么的清晰解释也会有所帮助。 感谢您指出。将“,”更改为 AND。此外,表 1 应用过滤条件后的数据仅为 60 行,如果将子查询替换为硬编码值,则通常需要 50 秒才能运行。表 2 应用过滤条件后的数据只是一个 int 值,单独运行需要 1 秒。 @GordonLinoff 请看看上面的评论,如果有帮助请告诉我。 如果您真的希望将所有行加入到一个 single max() 值中,可能会将该 single 值拉入一个变量,然后输入查询的变量(例如,and col3 = @max_column1(尽管 IQ 应该能够模拟这个)......或者你真的想根据相关的子查询/连接找到max()?在某些时候它会有所帮助查看查询计划以及两个表的完整索引列表;在Sybase IQ 数据库中进行查询甚至需要 50 秒听起来有点过分……或者您的实际查询是否比您提供的查询更复杂在这里? @markp-fuso 变量方法对我有用。感谢您的投入。 【参考方案1】:

将子查询移至FROM 子句:

SELECT t1.COL1, t1.COL2, t1.COL3, t1.COL4, t1.COL5, t1.COL6, sum(t1.COL7)
FROM TABLE1 t1 JOIN
     (SELECT MAX(COLUMN1) as max_column1 FROM TABLE2) t2
     ON t2.max_column1 = t1.date
WHERE Col1 = 'something' AND COl2 = date
GROUP BY COL1, COL2, COL3, COL4, COL5, COL6 ;

然后你想要索引:

table1(col1, col2, date) table2(column1)

【讨论】:

我将尝试查询。我不允许定义索引。 试过了。对查询执行时间没有影响。它继续运行。 @Sourabh 。 . .我认为正确的索引可能很重要。 我只能选择满足我的目的的值。 DBA 不允许创建索引或进行任何类型的操作。【参考方案2】:

您可以将子查询移至 select,然后使用 join 子句,看看是否有帮助。

SELECT max(COLUMN1), COL1, COL2, COL3, COL4, COL5, COL6, sum(COL7) 
FROM TABLE1 t1 join TABLE2 t2 
on t1.Col3 = t2.COLUMN1
WHERE Col1 = 'something' AND COl2 = date 
GROUP BY COLUMN1, COL1, COL2, COL3, COL4, COL5, COL6 

不是你在使用参数,但它听起来有点像参数嗅探。

【讨论】:

以上是关于带有子查询的 SQL 查询缓慢的主要内容,如果未能解决你的问题,请参考以下文章

mysql 表很少,一个大表上的子查询执行缓慢

带有子查询的 redshift sql 查询中的语法错误

如何将带有子选择的 SQL 查询转换为 MDX 查询?

带有(来自)别名的 SQL 子查询

带有多个子查询的 SQL 错误 10249 Hive

带有子查询的 SQL 更新