tuple:
定长
不定长
page 包含 header、record(tuples 以bytes 形式存入)、free space
tuple 包含 tuple header(包含 tuple里面每个attribute 的 offset)、columns
几种数据类型:
Date
Float
Integer
Number: int[]
varchar: char[]
找tuple 里面的 attribute 先读 header 然后一个一个读取
Cost models
Time cost
Page cost: number of pages read or written
如果 page in buffer => no cost
file:
btree, gist, gin, hash. heap, sorted file structures
heap file (unsorted file): 只要page有空余空间 就插入一个tuple
最好情况: 第一位就是空的
page cost 1 读了一个 + 1 写入一个 + 1 write header page
最坏情况:
b 读了b 个pages + 1 写 + 1 write header page
sorted file: tuples arranged in file in key order
worst case:
sorted: log2 b + 1 + 1 write header page
hash file: tuples placed in pages using hash function
hash key: for example hash key = 10
1 % 10 = 1
2 % 10 = 2
select * from R where k = 51
去第一页里面寻找
page cost = 1 + b(over pages)
select * from R where k > 50
通常 > 或者 < 是不走index的 因为所有页都需要遍历
就直接扫描了
scan tuple 不能用 for loop 形式
iterator 实现 tuple next_tuple(scan s)
用上一个tuple 指针 对应到 下一个tuple 指针的形式
不是 想要 tuple 5 就直接调用 tuple[5]
copy relation from s to t
old day:
从relation s 里面 一个一个page copy 到 relation t
page cost: #pages read + #pages written
right now:
copy file s tp file t
简单粗暴
Data file => file block => page
merge sort 归并排序
2-way merge sort
disk 1 -> disk 2
disk 1 里面 存入 page 1 and page 2
如果 page 1 里面 都比 page 2 小
存入 output buffer 最终 进入 disk 2
2 路归并排序 需要 3 个 buffer
n-way merge sort
all data fits into memory, sort using qsort()
直接在内存里面排序
projection page cost:
b read -> select 先select 读取所有pages + b t 想要的两列放入临时的tmp里面 + 2.bT.ceil(lognb0) 排序 + b t 去重复 + b out 去重后最终输出的page数目