5

这里

选择和交叉产品

叉积是评估成本最高的算子。如果输入关系有 N 和 M 行,则结果将包含 NM 行。因此,在应用叉积运算符之前尽最大努力减小两个操作数的大小是非常重要的。

假设我们有 2 个关系

第一个关系称为 Student 并具有 3 个属性,因此

    student
  |a |b   |c |
  ------------
  |__|___|___|
  |__|___|___|
  |__|___|___|

第二个关系是大学,又是 3 个属性

   university
  |e |f   |g |
  ------------
  |__|___|___|
  |__|___|___|
  |__|___|___|

每个关系有 3 行,所以在应用叉积运算后,我们将得到一个有 3*3 = 9 行的关系

现在,我不明白,为什么是 9 而不是 3?

最终的关系不会是

 final relation
 |a |b   |c |d |e   |f |g |
 --------------------------
 |__|___|___|__|____|__|__|
 |__|___|___|__|____|__|__|
 |__|___|___|__|____|__|__|

这不是又有 3 行吗?

谢谢

4

4 回答 4

5

如果 Student 中的行是 row1、row2 和 row3,而 University 中的行是 row4、row5 和 row6,那么笛卡尔积将包含

行1行4行1行5行1行6行2行4行2行5行2行6行3行4行3行5行3行6

每个可能的行组合。这就是它的定义方式。仅此而已。

除了您的评论“因此,在应用叉积运算符之前尽最大努力减小两个操作数的大小非常重要。”。重要的是要意识到确实存在能够“重写”某些代数运算的优化器。确定“将限制与其他操作结合的最合适方式”的责任当然不是始终由查询编写者承担。事实上,“尽可能将限制移到内部”是工业优化人员实际上非常擅长的事情之一。

于 2011-10-11T00:12:33.650 回答
2

试想一下,你有两张表,一张是学生表,一张是大学表,当你对关系数据库进行笛卡尔查询时,你会得到每个学生的一行,然后再加入每所大学。

Select *
   From students, 
        universities;

或者

SELECT * FROM students CROSS JOIN universities

我知道这与代数没什么关系,但是因为你在 stackoverflow 上:D

于 2011-10-10T15:24:45.790 回答
0

学生和大学之间没有共同的属性,因此学生中的每一行都与大学中的每一行匹配,3 * 3 = 9

于 2011-10-10T14:55:21.110 回答
0

|a|e| |a|f| |a|g| |b|e| |b|f| |b|g| |c|e| |c|f| |c|g|

因此 9

于 2011-10-23T03:10:27.893 回答