数据库系统实现 选择、投影、连接(SPJ)实验报告.docVIP

数据库系统实现 选择、投影、连接(SPJ)实验报告.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据库系统实现 选择、投影、连接(SPJ)实验报告

实验四 SPJ算法 实验内容: 选择操作算法 (Table Scan; Index Scan); 投影操作算法; 连接操作算法 (嵌套循环连接;基于排序的等值连接;基于散列的等值连接;基于索引的连接); 实验要求: 选择操作: 无条件选择; 等值条件; 非等值条件; 范围条件; 连接操作: 卡氏积(排序连接和散列连接例外); 等值条件; 非等值条件(排序连接和散列连接例外); 实验步骤: 本实验代码实现使用的是C语言。 iterator迭代器的设计: 我们对一个表不管是进行选择还是投影还是连接操作,都需要得到这个表的一条一条的元组,为此我们需要设计一个迭代器来方便的取出表中的元组。 下面是我们对迭代器的设计,在文件scantable.h中: struct iterator { int extent; /* current which extent */ int blk; /* in which block of the cur extent */ char b[PAGE_SIZE]; /* cur page content point */ int t; /* ?th tup of the cur page */ int len; /* tup len */ }; struct iterator open_iter(const char *tbname); int getnext_iter(struct iterator *iter, char * rec); /* fetch next tuple, store in rec */ int close_iter(struct iterator *iter); 由于我们对记录的存储是聚簇的,所以我们的迭代器是一次取出一个块,然后一条一条的抛出记录,这个块中的记录用完之后再读下一个块,直到读出了这个表中的所有的块,得到了表中的所有记录。 在iterator结构中,extent, blk, t分别表示当前的区间,块,记录位置;b[PAGE_SIZE]存储了当前取出的块,len是记录的长度。 open_iter()是打开一个迭代器,并进行初使化;close_iter()是关闭这个迭代器;getnext_iter()是得到下一条元组。具体的实现在scantable.c里面。 SPJ结果的输出: 在进行完选择和连接操作之后,得到的结果我们想返回给用户。我们实现了Oracle里里面SQL*plus界面里的返回结果的样式,即把结果表用字符界面显示出来。也在头文件scantable.h里面,如下所示: int print_tuple(char *rec, struct table_def *td); int print_tbhdr(struct table_def *td); print_tbhdr()是显示结果表的表头,print_tuple()是显示结果表里的所有记录。在实现上,因为我们的每一条记录都是以char[]存储在数据文件里面,所以这个函数就是从记录头里面得到记录的模式信息,然后按记录模式逐个解析这条元组,然后按一定的形式显示。 内存查找结构的实现: 由于在下面的实验(基于块的嵌套循环连接以及一些其它的一元操作)中要用到内存的查找结构:能在接近常量的时间内增加一个新元组,查找一个元组是否存在。所以我们需要实现一个这样的数据结构。这样的结构很多,像hash和平衡搜索树等等。我们选择了使用AVL树,也即平衡搜索树。因为我们觉得虽然时间性能上面AVL不如hash,但是在这个结构的管理上面,AVL还是有优势的。具体实现的接口如下(头文件avl.h中): struct BNode //define type of the node { int num; //number of nodes int bf; //balance-factor(1,0,-1:the tree is balance) KeyType key; //keyword InfoType data; //store data struct node *lchild , *rchild; //left child , right child struct node *same;//具有相同的key,但是其他信息不同 }; /*若平衡二叉树b中不存在与e相同的节点,则插入,并返回1;否则返回0 **@b:在b指向的平衡二叉树中插入数据 **@e:待插入的关键字 **@taller:表示这颗树是否增高*/ struct BNode *InsertBT(struct BNode *b , struct Record e , int *taller); /*@b:平衡二叉树据 **@k:待查找的关键字 找

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档