Buffer Pool(缓冲池)
Aim:保存那些需要重用的数据库文件中的page。
被用于读写想要的pages的access methods,如sequential scan,indexed retrieval 和 hashing。它使用文件管理函数去获取与table对应的data files。
Buffer pool的操作:
1 . request_page(pid) 2.release_page(pid)
一定程度上request_page()替代getBlock() or get_page(), release_page()替代putBlock() or put_page()。 release_page是指不再常用这个page了,如果buffer pool 满了则被换掉。Buffer pool比较稳定,一般读次数大于写。
Buffer pool的数据结构:
- frames… NBUFS Pages(8K) buffers的数组
- directory… NBUFS FrameData items的数组,给出每个frame的信息。
Directory里Info比较小 ,包括frame里是哪些pages,它们被修改了吗(dirty bit),哪些transactions在用它们(pin count),最近访问的时间戳等等。
Frames里包含page里的data,或者是空的。
PageID = BufferTag = (mode,forkNum,blockNum)
PS:fork是指额外的data file。
Scan without Buffer Pool(不用Buffer Pool的Scan):
Buffer buf;
//how many pages of data contained in this relation
int N = numberOfBlocks(Rel);
//Scan each of those pages of data
for (i=0; i<N; i++){
//get constructed pageID
pageID = makePageID(db,Rel,i);
//get block of data in page and feed into buffer
getBlock(pageID, buf);
for (j=0; j<nTuples(buf); j++){
process(buf, j)
}
}
需要读 N pages。如果再读一次,还是需要读N pages。
Scan with Buffer pool(使用 Buffer Pool的Scan):
Buffer buf;
int N = numberOfBlocks(Rel);
for (i = 0; i<N; i++){
pageID =