本博客会陆续写一些和操作数据有关的基本算法。内容都很基础,算是帮助大家回顾记忆。也可以给和我一样,刚接触数据库,数据挖掘等技术的同学,提供一个迅速了解基本算法的文档。我认为多多体会基本算法,不光是为了编程、性能优化,还可以学习到很多分析解决问题的方法。好了,不多废话,欢迎大家来评论;如文中有错误,也欢迎大家来拍砖哈~
我们查询数据时经常会用到联合查询
select r,s from R join S on R.id=S.rid
这个连接是怎么运算的呢?代价有多大呢?我们来分析一下。先来看下运算结果集的大小:若R∩S=空,则连接为笛卡尔积。 若R∩S是R的码,可知s的一个元组至多与r的一个元组连接。因此连接结果集的元组数不会超过s中的元组数。 若R∩S既不是R的码也不是S的码,令R∩S={A},设S的元组数ns,V(A,s)为S中属性A所具有的不同值的数目,则ns/V(A,s)是S关系中属性A的值给定情况下平均的元组数目,则在r连接s的结果集中有nr*ns/V(A,s)个元组。
首先介绍最基础的连接方式:嵌套循环连接。要计算r和s的theta连接,看伪代码:
for each 元组tr in r do
begin
for each 元组ts in s do
begin
测试元组对(tr,ts)是否满足连接条件theta
如果满足,把tr*ts加到结果中
end
end
若元组对数目是nr*ns,对于关系r中的每一条记录,我们必须对s做一次完整扫描。最好的情况,内存空间容纳两个