SQL不必要的FROM表

时间:2018-08-03 00:12:53

标签: sql performance select

我正在执行一个查询,该查询仅对应一个表,但是正在搜索多个表。这是一个类似的示例:

SELECT Earth.moon
FROM Earth, Mercury, Venus, Jupiter

没有理由要搜索其他星球的表,因为我们正在寻找只能在地球表中的列(Earth.moon)。但是,当包含水星,金星和木星时,查询变得非常慢。

由于要搜索的列是动态填充的,因此不能简单地从查询中删除水星,金星和木星,我该如何避免搜索不必要的表?

2 个答案:

答案 0 :(得分:1)

当包含所有四个表时,由于生成了“隐式交叉联接”,因此查询速度变慢。有关详细信息,请参见Cross Join

只需删除不需要的表即可加快查询速度。此外,交叉联接会产生相同行的多个重复,所有表上每个可能的行组合都会重复一个,也称为“笛卡尔积”。当每个表的行数很多时,这真的很慢。

答案 1 :(得分:0)

查询必须首先将所有Earth行加入所有Mercury行,然后再加入所有Venus行,然后再加入所有Jupiter行,以产生交叉联接表,称为Cartesian product

Earth.Moon  Mercury  Venus    Jupiter
==========  =======  =======  =========
Luna        No Moon  No Moon  Calysto
Luna        No Moon  No Moon  Ganymede
Luna        No Moon  No Moon  Io
etc.

您的查询可能只返回一列Earth.Moon,但是查询必须为4个表中的每个行组合生成一个单独的行。因此,您会得到一个非常无聊的列表,该列表在重复等于(# Earth rows) X (# Mercury Rows) X (# Venus Rows) X (# Jupiter Rows)的行数中重复“ Luna”:

Earth.Moon
==========
Luna
Luna
Luna
etc.