为什么子查询上的连接会很慢?我们能做些什么来加快速度呢?(SQL)



这是一个数据科学面试问题。

我对子查询的理解是,特别是对于依赖于外部查询的相关子查询,相关子查询需要外部查询向其传递多个或一个值,然后才能解析子查询。这意味着您需要多次处理子查询,对外部查询中的每一行执行一次。

特别地,在这种情况下,如果内部和外部查询分别返回M和N行,则总运行时间可能为O(M*N)

所以一般来说,这将是我的答案为什么运行子查询可能会很慢,但我错过了任何其他与子查询上的连接有关的东西吗?我也不确定怎样才能使它更快。

我当然会感谢任何提示或帮助。

谢谢!

我认为你的答案应该是正确的:子查询是缓慢的,如果它们是相关的。不相关的子查询只计算一次。

可以做些什么来加速:相关子查询可以重写为连接!而且连接查询可以执行得更快!

如果您使用一个好的RDBMS,优化器通常能够将相关子查询重写为连接查询(然而,并非所有情况都是如此)。然而,如果您使用简单的RDBMS,要么根本没有优化器,要么优化器不是很先进(即,不能将子查询解嵌到连接查询中)。对于这些情况,您需要手动重写查询。

哇,真是个开放式问题!我不确定他们想让你在多大程度上跳出框框,但有一些可能的原因:

标准太宽泛

你的查询条件可能太宽泛了,你可以添加一些额外的子句来减少RDBMS必须处理的数据量。

缺少索引

如果相关列上没有任何索引,RDBMS可能不得不求助于全表扫描,这可能会很慢。

陈旧数据

如果统计数据有一段时间没有更新,RDBMS可能无法全面了解数据的倾斜情况,这会严重影响执行时间。

数据库物理布局

如果索引和表在同一个物理驱动器上,这可能会造成IO争用。

并行

RDBMS可能没有正确设置并行性,这意味着RDBMS可能没有充分利用可用的硬件。

调度

查询的运行时间会影响执行时间。这个查询在几个小时内运行会更好吗?

数据变化

数据更改会影响数据的倾斜,在极少数情况下会产生笛卡儿。在大型数据库中,至少在行级别上应该有完整的数据可追溯性,以跟踪数据问题。

与高使用率相关的是锁定问题。如果你需要干净的读取,可能会有对所需数据的争用,这会减慢查询速度。

错误的执行计划

你可能已经拿出了执行计划,但这些并不总是说明全部情况。成本是CPU和IO的函数,但您的系统可能更依赖于其中一个。一些rdbms的设置可以强制优化器将成本偏向一边或另一边,以产生更好的计划。

未缓存的静态数据

如果每次都要重新计算一些静态数据,这将影响成本。这些数据应该存储在索引表或临时表中,以减少RDBMs需要处理的处理量。

查询太复杂

虽然查询可能扫描得很好,但如果您可以使用临时表或类似的方法将其分成块,这可能会执行得更好。


我就讲到这里,因为我可以很容易地用今天剩下的时间来补充这个,但希望这能给你们带来一些启发

相关内容

最新更新