我正在进行一个仅对应于一个表的查询,但是,正在搜索多个表。下面是一个类似的例子:
SELECT Earth.moon
FROM Earth, Mercury, Venus, Jupiter没有理由搜索另一个星球的表,因为我们正在寻找只能在地球表中的列(Earth.moon)。但是,当包含水星、金星和木星时,查询会变得非常慢。
由于要搜索的列是动态填充的,因此不能简单地从查询中删除Mercury、Venus和Jupiter,如何避免搜索不必要的表?
发布于 2018-08-03 08:52:28
当您包含所有四个表时,您的查询将变得很慢,因为您正在生成“隐式交叉联接”。详情请参见Cross Join。
只需删除不需要的表即可使查询速度更快。此外,交叉连接会产生相同行的多次重复,所有表上的每种可能的行组合都会产生一个重复行--也称为“笛卡尔积”。当每个表的行数很高时,这会使它变得非常慢。
发布于 2018-08-03 11:05:20
查询必须首先将所有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)的行重复“露娜”
Earth.Moon
==========
Luna
Luna
Luna
etc.https://stackoverflow.com/questions/51663715
复制相似问题