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