写在前面
我们在之前几篇文章中讲到了几种最基础的indexing、以及join的实现,接下来将会讲到数据库的projection、查询语句优化等算法。
Projection 是什么
表示我们希望文档在结果中集中的形状,比如
SELECT first_name, last_name, email
FROM customers;
那么我们只想我们最后的结果中展现出 first_name, last_name, email这三列的数据
SELECT DISTINCT
R.sid, R.bid
FROM Reserves R
这也是投影,实现了distinct的结果
基于sorting
- 使用external sort(之前已经讲述)来进行排序,并将其中不需要的列去除
- merging来去除重复的部分
- 损耗:
- 读取,排序
- 找到所有重复的
- O(M logM)
基于hashing的 projection
- Partition:
- 使用一个输入buffer来读取R,对于每一个tuple来说,都需要丢弃不需要的fields,并且使用h1来将其放到b-1个partition中去
- 对于每一个partition来说,都需要读取并使用一个in memory hash table, 将h1和h2来进行比较,同时丢失所有的duplicates
projection 总结
-
基于sort的方法是业界标准。
-
可以基于index来进行scan
-
Ordered index,如果index是ordered,那么其scan的速度会更快
Set
- Union and Except similar
- 基于sorting的union
- 首先将两个关系都进行排序,并将重复的
- 对已经排序的relation进行扫描,并将其merge(external (merge)sort)
- 基于hash的union
- 将r和s使用hash function分为很多个partition
- 对于每一个s partition,在memory中建立一个hash table,扫描对应的r tuples,将r和s进行对应,将对应r中的tuples放到table中去,同时丢失重复的部分
hash-join的pseudocode
AVG,MIN
- 这些操作如果不用group by的话,会需要对整个relation进行扫描。如果index包含了select中需要的所有的attributes,则可以进行index only scan。
- 如果使用grouping的话
- 如果使用group-by这个attributes,对针对每一个group来进行aggregate,即先根据group by的每一个参数进行partition,再将这些partion进行join ,再进行avg, min等操作。