我正在执行一个查询,该查询仅对应一个表,但是正在搜索多个表。这是一个类似的示例:
SELECT Earth.moon
FROM Earth, Mercury, Venus, Jupiter
没有理由要搜索其他星球的表,因为我们正在寻找只能在地球表中的列(Earth.moon)。但是,当包含水星,金星和木星时,查询变得非常慢。
由于要搜索的列是动态填充的,因此不能简单地从查询中删除水星,金星和木星,我该如何避免搜索不必要的表?
答案 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.