加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQL的一些实现算法---笛卡尔积

(2010-10-10 22:24:25)
标签:

it

分类: 数据库

笛卡尔积的实现算法

1、简单算法

   计算笛卡尔积的最简单算法是嵌套循环算法

   For R中每个元组r Do

       For S中每个元组s Do

           产生元组(rs),存入结果关系;

       endFor

    endFor

注意,R和S在算法中的位置可以调换,但是把小关系放在外层循环可以节省时间

2、主存算法

   如果M》Bs+Br,可以首先把R和S读入主存,然后在主存中产生R*S。

   读入R和S;

   For 主存中R的每个元组r Do

       For 主存中S的每个元组s Do

           产生元组(rs),存入结果关系

       endFor

   endFor

显然,这个算法需要Br+Bs+Br*s块磁盘存取。

3、半主存算法

   如果Br》Bs,Bs

   设SB是存储S的主存区,RB是R的缓冲区,半主存算法的形式定义如下:

   读入S到SB;

   WHILE R中仍有元组待处理 Do

         读R的元组到RB; 

         For RB中每个R元组r Do

             For SB中每个S元组s Do

                 产生元组(rs),存入结果关系;

             endFor

          endFor

    endWhile

类似于主存算法,这个算法需要Br+Bs+Rr*s块磁盘存取

4、大关系算法

   如果M《Br,M《Bs,则R和S都不能一次读入主存。设Bs《Br。我们把关系S划分为Bs/(M-1)个子集合,每个子集合具有M-1块。令SB是容量为M-1块的S的主存缓冲区,RB是容量为一块的R的主存缓冲区。大关系算法的形式定义如下:

   For i=1 to Bs/(M-1) Do

       读S的第i个子集合到SB;

       For j=1 to Br Do

           读R的第j块到RB;

           For RB中每个R元组r Do

              For SB中每个S元组s Do

                  产生元组(rs),存入结果关系;

              endFor

           endFor

        endFor

    endFor

这个算法需要Br/(Bs/(M-1))+Bs+Br*s块磁盘存取

         

   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有