这周在看谭老师关于latch的视频,其中涉及到 Bucket、Hash Chain List和X$bh这几个概念,上网搜索了一些资料,综合看了之后对latch的问题理解增加了不少,现在整理分享如下:
一、 Bucket
1、直接从英文单词的意思理解:
bucket [简明英汉词典]
[5bQkit]
n.桶, 一桶的量, [桶状物]铲斗
桶,如同巧克力店里,不同的桶里装的是不同大小/类型/品牌的巧克力.
2、在oracle当中,bucekt这个“桶”当中存放的是内存块(chunk)。
为什么会出现“桶”?
随着物理内存空间增大,如果都使用整体遍历的方式,要在这么大的空间里查找到合适的内存块,需要消耗很多时间;为了加快查找的速度,Oracle采用了hash 桶的方式:具体来说就是根据file#和block#套进hash函数,获得对应的bucket#(这个bucket就是hash bucket)。然后,在每个bucket下面,以双向链表的方式,挂了多个同规格的内存块,进程在这个双向链表(这个双向链表就是Hash Chain List)里,才按照遍历的方式查找满足要求的内存块,由于查找范围大大地缩小,所以查找速度也大大地提升。
不同的“桶”是根据什么来区分的呢?
答案是:内存块的大小。下面来看一段大牛关于bucket的解说:
1). Bucket可以为空
Bucket0 * *
Bucket1
Bucket2 * * *
如果Bucke1是空的,自然要转向下一个 '非空' 的Bucket"
2).每个bucket存放固定大小的chunk
比如
bucket0 0~20
bucket1 20~40
bucket2 40~80
你现在要一块30的,如果bucket1为空,只好在bucket2里找一个,比如找到一块45的,用掉30,剩下的15进入bucket0.