PostgreSQL 9.5.3 文档 | |||
---|---|---|---|
上一页 | 上一级 | 章 62. BRIN索引 | 下一页 |
BRIN代表块范围索引。BRIN 设计用于处理非常大的表,其中某些列与表中的物理位置具有一些自然相关性。 block range是一组在表中物理上相邻的页;对于每个块范围, 一些摘要信息由索引存储。例如,存储商店的销售订单的表可以具有放置每个订单的日期列, 并且大多数时间较早的订单的条目也会在表中较早出现; 存储ZIP编码列的表格可能会将城市的所有代码自然组合在一起。
BRIN索引可以通过常规位图索引扫描来满足查询, 并且如果索引存储的摘要信息与查询条件一致, 则将返回每个范围内的所有页面中的所有元组。查询执行器负责重新检查这些元组, 并丢弃那些与查询条件不匹配的元组。换句话说,这些索引是有损的。 因为BRIN索引非常小, 所以扫描索引与顺序扫描相比几乎没有增加开销, 但是可以避免扫描已知不包含匹配元组的表的大部分。
BRIN索引将存储的特定数据,以及索引将能够满足的特定查询, 取决于为索引的每个列选择的运算符类。 具有线性排序顺序的数据类型可以具有存储每个块范围内的最小值和最大值的运算符类, 例如,几何类型可以存储块范围中所有对象的边界框。
块范围的大小由索引创建时pages_per_range存储参数确定。 索引条目的数量将等于页面中的关系的大小除以pages_per_range的所选值。 因此,数字越小,索引变得越大(因为需要存储更多的索引条目), 但是同时存储的摘要数据可以更精确,并且在索引扫描期间可以跳过更多的数据块。
在创建时,将扫描所有现有索引页,并为每个范围创建一个摘要索引元组,
包括结尾处可能不完整的范围。当新页面填充数据时,
已经汇总的页面范围将导致用来自新元组的数据更新摘要信息。
当创建不在最后概括的范围内的新页面时,该范围不会自动获取摘要元组;
那些元组保持未汇总,直到稍后调用汇总运行,从而创建初始汇总。
此过程可以使用brin_summarize_new_values(regclass)
函数手动调用,或者在VACUUM处理表时自动调用。