第十九讲 查询实现算法
1.过程:sql->关系模式的运算的各种组合->DBMS的解释与调用
2.三大类操作:
3.各类参数:
4.连接操作的实现算法:①-④表空间扫描法
①最笨的:逐个块存入,然后进行连接,每次在内存里的只有三个块 基本实现方法
②稍微聪明的:将两个关系完全放进内存里,然后再做连接 全主存
③稍微聪明的:将其中一个放得下的关系完全放进内存里,另一个关系逐块放入,再做连接
④无可奈何的:将其中一个关系都拆分成最大能放进的子集,即M-2,然后另一个关系逐个存入,结束再下一个子集
5.迭代器算法:用于解决单一元组的一元操作
分为open函数,GetNext函数,close函数,而且上层的迭代器可以调用下层的迭代器
6.一趟扫描算法:
7.连接操作的优化:
讲条件转化为散列值的匹配
8.基于索引的选择算法:
由于索引文件位于内存,比较其磁盘的存取时间,内存的访问时间简直可以忽略不计,
分析:当有聚簇的情况下,需要搜索的块数,用记录数/块的容量即可,当有索引的时候,就不用了将整条记录放入内存,根据索引找到相应的记录,再存入内存,所以时间上只要算条件合适的记录数、
错题分析:
分析:能一趟实现的只有包的并操作,无脑的扫描并且输出即可
分析:open之后获得一个r,调用getnext会扫描s,若有相同则输出,当没有换一个,再重新搜索s
分析:A。要求M必须大于非重复元组所占的磁盘块数,才能执行 B.散列和排序皆可以满足快速比较,使用方法hash,二分
c。hash之后只会对应一个内存块,仅跟它比较即可 D.一边扫描一边建立即可
分析:本题为寻找不正确的:A。分组必然要全部放在内存里,正确, B.排序和散列都是为了方便比较 c。进行hash后只需跟少数的内存块计算 D.分组聚集应当在开始之前就建立好数据结构
第二十讲
1.多趟扫描:由于有些时候,需要操作的元组数目过大,所以需要通过排序或者散列或者索引先处理一部分块,然后存进磁盘,然后再将处理好的子表逐个块拿出来,操作
2.多路归并算法:
如果总的元组个数的超过了内存的平方,那么我们需要多趟归并
3.关于包和集合的∪,∩,差操作:
集合并:则是需要去重,需要在比较的时候,顺便去除重复的部分
包并:全部排序后,直接输出即可
集合交:需要去重,在两个集合中都有出现,则又一次
包交:则是两个包中出现次数的最小值
集合差:即R中元组在R,S中同时出现,则不会出现
包差:即元组在R中出现的次数-S中出现的次数
4.基于散列:
也是差不多的逻辑,先通过一个散列函数将将所有的元组分成M个集合,那么会出现匹配的就会在各自的集合中,在选用另一种散列函数对集合中的元素进行处理,然后实现去重,分组,并,交,差
错题分析:
分析:如何才能获得最优的归并操作呢?其实内存有100块,那么我们归并,就希望有99个集合,那么10000块能分成100个集合,然后将其中两个归并成一个,再用这个和余下的98个