# 68.1.导言

68.1.1. 索引维护

BRIN代表区块范围指数。BRIN设计用于处理非常大的表,其中某些列与其在表中的物理位置具有某种自然相关性。A.区块范围是表中物理上相邻的一组页面;对于每个块范围,索引存储一些摘要信息。例如,存储商店销售订单的表可能有一个日期列,每个订单都是在该列上下的,而且在大多数情况下,早期订单的条目在表中也会出现得更早;存储邮政编码列的表可能会将一个城市的所有代码自然地分组在一起。

BRIN索引可以通过常规位图索引扫描来满足查询,如果索引存储的摘要信息是一致的使用查询条件。查询执行器负责重新检查这些元组,并丢弃那些与查询条件不匹配的元组——换句话说,这些索引是有损的。因为BRIN索引非常小,所以与顺序扫描相比,扫描索引会增加很少的开销,但可以避免扫描表中已知不包含匹配元组的大部分。

BRIN索引将存储的特定数据,以及该索引能够满足的特定查询,取决于为索引的每一列选择的运算符类。例如,具有线性排序顺序的数据类型可以具有存储每个块范围内的最小值和最大值的运算符类;几何类型可能会存储块范围内所有对象的边界框。

块范围的大小在索引创建时由每个范围的页数存储参数。索引项的数量将等于页面中关系的大小除以每个范围的页数因此,数字越小,索引越大(因为需要存储更多索引项),但同时存储的摘要数据可能更精确,在索引扫描期间可以跳过更多数据块。

# 68.1.1.索引维护

在创建时,将扫描所有现有堆页,并为每个范围创建摘要索引元组,包括末尾可能不完整的范围。当新页面充满数据时,已经汇总的页面范围将导致使用新元组中的数据更新汇总信息。当创建的新页面不在上一个摘要范围内时,该范围不会自动获取摘要元组;这些元组保持未汇总状态,直到稍后调用汇总运行并创建初始汇总。可以使用布林范围(regclass,bigint)brin_汇总新值(regclass)功能;当真空处理表格;或者当插入发生时,通过autovacuum执行自动摘要。(默认情况下,最后一个触发器处于禁用状态,可以通过自动汇总参数。)相反,可以使用brin_desummarize_范围(regclass,bigint)函数,该函数在索引元组不再是一个很好的表示形式时非常有用,因为现有值已更改。

启用自动汇总后,每次填写页面范围时,都会向autovacuum发送一个请求,要求它对该范围执行有针对性的汇总,并在同一数据库上的下一次worker运行结束时完成。如果请求队列已满,则不会记录请求并向服务器日志发送消息:

LOG:  request for BRIN range summarization for index "brin_wi_idx" page 128 was not recorded

发生这种情况时,将在下一次定期的表格真空期间正常汇总范围。