为什么子查询上的连接可能会变慢?可以做些什么来加快速度? (SQL)

时间:2015-07-30 13:16:45

标签: sql

这是一个数据科学访谈问题。

我对子查询的理解是,特别是对于依赖于外部查询的相关子查询,相关子查询需要在解析子查询之前由外部查询传递更多或一个值。这意味着您需要多次处理子查询,外部查询中的每一行都需要处理一个子查询。

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

所以一般来说,这就是我为什么运行子查询可能会很慢的答案,但是我错过了任何与加入子查询有关的内容吗?此外,我还不确定如何才能加快速度。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你的答案应该是正确的:如果子查询是相关的,则子查询很慢。不相关的子查询只进行一次评估。

可以对加速做些什么:相关子查询可以重写为连接!并且连接查询必须更快执行!

如果使用良好的RDBMS,优化器通常能够将相关子查询重写为连接查询(但并非适用于所有情况)。但是,如果使用简单的RDBMS,则根本没有优化器,或者优化器不是很先进(即,不能将子查询排除在连接查询之外)。对于这些情况,您需要手动重写查询。

答案 1 :(得分:0)

哇 - 这是一个开放式的问题!我不确定他们想让你思考多远,但有一些可能的原因:

标准过于宽泛

您的查询条件可能过于宽泛,可能会添加额外的条款,这会减少RDBMS必须处理的大量数据。

缺乏索引

如果相关列上没有任何索引,则RDBMS可能不得不采用可能很慢的全表扫描。

过时的统计信息

如果统计数据尚未更新一段时间,则RDBMS可能无法全面了解可能会严重影响执行时间的数据偏差。

数据库的物理安排

如果索引和表位于同一物理驱动器上,则可能会产生IO争用。

<强>并行

对于并行性,可能无法正确设置RDBMS,这意味着RDBMS可能无法充分利用可用硬件。

计划

运行查询的时间会影响执行时间。查询是否会更好地耗尽时间?

数据更改

数据更改可能会影响数据的偏差,并且在极少数情况下会产生笛卡儿。在大型数据库上,行级别的数据应该具有完全可追溯性,至少可以追踪数据问题。

<强>锁定

与高级别使用相关的是锁定问题。如果您需要干净的读取,可能会对所需的数据产生争用,这可能会降低查询速度。

误导性执行计划

你可能已经取消了执行计划,但这些并不总是讲述完整的故事。成本是CPU和IO的函数,但您的系统可能比其他系统更受限制。一些RDBMS的设置可能会迫使优化者将成本偏向一方或另一方以产生更好的计划。

未缓存静态数据

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

查询过于复杂

虽然查询可能会很好地扫描给您,但如果您可以使用临时表等将其分解为块,则可以显着改善。

我会在那里停下来,因为我可以轻松地度过剩下的时间来增加这一点,但希望这会给你一种味道。