here它说
选择和交叉产品
交叉产品是评估最昂贵的运营商。如果输入关系具有N和M行,则结果将包含NM行。因此,在应用交叉乘积运算符之前,尽量减小两个操作数的大小非常重要。
假设我们有两个关系
第一个关系称为学生,有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行吗?
由于
答案 0 :(得分:5)
如果Student中的行是row1,row2和row3,而University中的行是row4,row5和row6,那么笛卡尔积将包含
row1row4,row1row5,row1row6,row2row4,row2row5,row2row6,row3row4,row3row5,row3row6
每个可能的行组合。这就是它的定义方式。没有更多的东西。
除了您的评论“因此,在应用交叉产品运算符之前,尽量减少两个操作数的大小非常重要。”重要的是要意识到存在能够“重写”某些代数运算的优化器。当然,情况并非总是在查询编写者身上确定“将限制与其他操作相结合的最合适方式”。事实上,“尽可能将限制移到内部”是工业优化者实际上非常擅长的事情之一。
答案 1 :(得分:2)
想象一下,你有两个表与学生和一个与大学的表,当你对关系数据库进行笛卡尔查询时,你会得到每个学生的一行,而每个学生都加入到每所大学。
Select *
From students,
universities;
OR
SELECT * FROM students CROSS JOIN universities
我知道这与代数关系不大,但是因为你的堆栈溢出:D
答案 2 :(得分:0)
学生和大学之间没有共同的属性,所以学生的每一行都与大学的每一行相匹配,3 * 3 = 9
答案 3 :(得分:0)
| A | E | | A | A | | A | G | | B | E | | B | F | | B | G | | C | E | | C | F | | C | G |
因此9