【问题标题】:How optimizing cartesian product query in SQL如何在 SQL 中优化笛卡尔积查询
【发布时间】:2012-08-13 18:48:29
【问题描述】:

我在 SQL 中查询多个表的笛卡尔积。

如果我查询

SELECT * FROM TABLE1, TABLE2, ... , TABLE n   WHERE ....

可能很快。

它只提供 1-3 次点击。

现在,如果我查询更多表,

SELECT * FROM TABLE1, TABLE2, ... , TABLE n, TABLE n+1, ..., TABLE m   WHERE ....

它会慢慢分解。

为什么? sql是否从最后一张表开始遍历所有组合?

我的优化问题:

我应该选择 TABLE 1 作为最能缩小和过滤搜索范围的表,还是最后一个 TABLE m?

或者还有什么?

【问题讨论】:

  • 您没有优化笛卡尔积-您避免它! :-)
  • 如果你应用WHERE条件,它就不再是一个纯笛卡尔积了。您的情况如何?
  • 另见:[要踢的坏习惯:使用旧式 JOIN](sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using- old-style-joins.aspx) - 这在避免不需要的笛卡尔积时也很有帮助!
  • 我同意 marc_s - 你想要一个笛卡尔积(这似乎不太可能 - 行数将是所涉及表的所有行数的乘积),或者你不想要它( 99% 以上的情况都是这样)。
  • Mark Byers:MySQL——感谢所有 cmets,他们已经提供了帮助。 弗兰克·施密特:确实。每张桌子的点击率都会迅速下降。 ——我的想法是这样的。每增加一张桌子,病例就会迅速减少。可以说,每张桌子减少到 1/1000 的情况。所以我只需要检查 (1/1000)^n 个案例。 --- marc_s:谢谢。 --- 我会检查这个帖子。

标签: sql query-optimization cartesian-product


【解决方案1】:

您的标题说明了一切 - 笛卡尔积。除非您在各个表之间指定连接条件,否则数据库服务器将尝试生成 EVERY 可能的记录组合。当您添加表格时,它会快速增长,例如5 个表,10 = 10^5,100,000 条记录。

您需要使用正确的连接技术(左、右、内)连接子句来缩小记录集的范围。

【讨论】:

  • 谢谢,不知道JOIN有帮助。
  • 但是会更快吗? INNER JOIN 比 "WHERE table1.ID = table2.POINTER_TO_ID" 快吗?
  • 肯定的。它不必检索您的 n^m 记录组合,只需检索符合连接条件的记录组合即可。
  • #Marc B:好的。虽然对我来说不是很清楚。如果它在第一个表中选择 ID,那么它还必须搜索第二个表中 POINTER_TO_ID = ID 的行,不是吗?或者 SQL 是否有更多信息来避免这种搜索。
  • 我有个经验猜想:如果查询笛卡尔积(表1,...,表n)有WHERE条件,那么不做前向引用:WHERE ID(table 1)= DATA(table 2)还可以,但是另一个方向(1 2)效率低下。
【解决方案2】:

在 3 张桌子上加入几张桌子也很慢。 解决方案可以是选择的一些乘法

类似的东西:

SELECT * FROM TABLE1, 
  (SELECT * FROM TABLE2, 
     (SELECT * FROM TABLE3, 
        (..)
      WHERE ..) 
   WHERE .. )
WHERE
 ... 

【讨论】:

  • 是的,这也是我的选择。因为第一个选择只有 3 次命中并且非常快。为什么要从这 3 个案例中进一步“选择”这么多时间。这也是我的问题。
  • 可能是最新的表格太长了。您的版本连接所有行并从中选择三个匹配项。但如果选择特别是逐表进行,那么每个括号只会出现几行
  • 谢谢。我同意。当 SQL 无法使用笛卡尔积或内连接处理时,您的建议也是我最坏的情况解决方案。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
相关资源
最近更新 更多