postgresql bitmap理解

benchmarksql=# EXPLAIN SELECT * FROM bmsql_customer WHERE c_city = 'San Mateo' or c_city='San Francisco';
QUERY PLAN
---------------------------------------------------------------------------
Bitmap Heap Scan on bmsql_customer (cost=8.94..56.34 rows=12 width=558)
Recheck Cond: (((c_city)::text = 'San Mateo'::text) OR ((c_city)::text =
'San Francisco'::text))
-> BitmapOr (cost=8.94..8.94 rows=12 width=0)
-> Bitmap Index Scan on city_idx (cost=0.00..4.47 rows=6 width=0)
Index Cond: ((c_city)::text = 'San Mateo'::text)
-> Bitmap Index Scan on city_idx (cost=0.00..4.47 rows=6 width=0)
Index Cond: ((c_city)::text = 'San Francisco'::text)
(7 rows)

In the preceding example, we are fetching all the customer information whose city is either
San Mateo or San Francisco. As per the preceding plan, the optimizer has generated
two bitmap pages for each city from the city_idx index. And these two bitmap pages are
merged using the BitmapOr operation, and the result is forwarded to the bitmap heap scan.
Once the bitmap index is created, the bitmap heap scan will perform sorting on the bitmap
page, and then fetch the records from the relation in the sequential order. In the preceding
example, the optimizer has created two bitmap pages for each city, and we can limit this
number by using the IN operator. The bitmap heap scan cost is indirectly proportional to
the number of bitmap pages. Let’s observe the following query, which retrieves similar
results to the previous example:

上面样本输出的执行计划,fetch所有城市是San Mateo 或者 San Francisco的客户信息,按照这个执行计划,优化器为产生了两个bitmap pages,一个为San Mateo,另一个为San Mateo,然后透过BitmapOr Operation merged这两个bitmap page,并将结果转发到bitmap heap scan,一旦bitmap index被建立,bitmap heap scan 将在bitmap page上执行sort,然后就可以按照sequential order从relation fetch表记录(这也是sort的原因,因为sequential 比random read效率更好),在这个范本中,优化器为这两个wehere条件产生了两个bitmap page,其实可以透过使用in操作限制bitmap pages的数量,位图堆扫描成本与位图页数成间接比例,让我们观察以下查询,它检索到与上一个示例相似的结果:

benchmarksql=# EXPLAIN SELECT * FROM bmsql_customer WHERE c_city IN
('San Mateo','San Francisco');
QUERY PLAN
-----------------------------------------------------------------------
Bitmap Heap Scan on bmsql_customer (cost=8.94..56.30 rows=12 width=558)
Recheck Cond: ((c_city)::text = ANY ('{"San Mateo","San Francisco"}'::text[]))
-> Bitmap Index Scan on city_idx (cost=0.00..8.94 rows=12 width=0)
Index Cond: ((c_city)::text = ANY ('{"San Mateo","San
Francisco"}'::text[]))

bitmap heap scan图解如下:在这里插入图片描述
1.首先scan index产生bitmap index
2.然后将结果发送到bitmap heap scan
3.bitmap heap scan 根据结果去fetch表记录(这里应该少了前述的sort操作)
index scan : 是对于给定的查询,先扫描一遍索引,从索引中找到符合要求的记录的指针,再定位到表中具体的page去取。
4.普通的index scan每次从索引中获取一个元组指针,并立即访问表中的元组,那么一个 PAGE 有可能被多次访问,而位图扫描一次性从索引中获取所有的元组指针,使用内存中的“位图”数据结构对它们进行排序,然后按物理元组位置顺序访问表元组。
它的核心思想是单个page在扫描期间只访问一次。
5、Bitmap Scan的缺点是什么?
从上面的分析中可以看出,Bitmap的优化是通过bitmap的生成过程中增加内存与CPU的消耗来减少IO消耗。
第4、5点总结摘自:https://blog.51cto.com/u_15064650/2884485

### 回答1: `bitmapand` 是 PostgreSQL 中的位图操作函数之一。它将两个位图进行按位与(AND)操作,返回一个新的位图。该函数用于处理大型数据集时的高效查询,可以加速查询过程。用法如下: ```sql bitmapand(bitmap1 bitmap, bitmap2 bitmap) RETURNS bitmap ``` 其中,`bitmap1` 和 `bitmap2` 是两个需要进行按位与操作的位图,返回值为新的位图。需要注意的是,两个位图的长度必须相等,否则会报错。此外,该函数只能用于位图类型的操作,不能用于其他类型的数据。 ### 回答2: postgresql中的bitmapand是一种位图与运算操作。位图是一种数据结构,用于表示一组二进制位的集合。位图与运算操作是将两个位图进行逐位的与运算,结果中每一位的值都是对应位上两个位图相应位置上的位进行与运算的结果。 位图与运算是数据库中一种用于高效处理位图索引的操作。位图索引是一种索引结构,用于加速查询操作。它将每个可能的值都映射到一个位图,每个位表示该值是否在对应的记录中出现。位图索引可以大大加快查询操作的速度,尤其是对于包含大量唯一值的列。 位图与运算操作可以用于多个位图的交集操作。通过对位图进行与运算,可以找到同时出现在两个位图中的位,并将结果存储在新的位图中。这个新的位图代表了两个原始位图的交集。 位图与运算操作在处理位图索引时非常有用。它可以用于组合多个位图索引,从而筛选出满足所有条件的记录。通过将多个位图索引进行位图与运算,可以快速得到满足所有条件的记录的位图。 总之,postgresql中的bitmapand是一种对位图进行逐位与运算的操作,可以用于处理位图索引,并快速筛选出满足多个条件的记录。 ### 回答3: postgresql中的bitmapand是一种用于比较多个位图的操作。位图是一种数据结构,它将每个元素表示为一个位,用于表示某个属性是否满足特定条件。 bitmapand操作可以将多个位图进行逻辑与运算,返回一个新的位图作为结果。该操作会对位图的每个位进行与运算,只有当所有位图中对应的位都为真时,结果位图才对应的位为真,否则为假。 使用bitmapand可以实现对多个属性的条件进行交集运算,找出同时满足所有条件的记录。这在数据库查询中特别有用,可以提高查询效率。例如,可以使用bitmapand操作来查找同时符合两个条件或多个条件的记录。 然而,需要注意的是,在使用bitmapand操作时,需要确保所有位图的位数相同,否则会导致运算错误。另外,bitmapand操作的结果位图可能会比原始位图更小,因为只有在所有位图都为真时才会返回真。 总结而言,postgresql中的bitmapand是一种用于比较多个位图的操作,通过对位图中的每个位进行与运算,返回一个结果位图,用于实现多属性条件的交集运算。它在数据库查询中可以提高查询效率,但需要确保位图的位数相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值