pageinsepect分析brin索引

简介:

brin索引是postgresql9.5版本中新增的功能,这个索引的特点就是占用空间特别小,原理是这样的,它是将表的数据页面按每128个数据块(页面)分配一条索引记录,记录这个区间的最大值和最小值,当你要查询某条数据时,判断这个值在哪个区间范围内,找到呢条索引记录,根据索引记录扫描相应的128个数据块。128这个值是默认的,在创建索引的时候可以进行调整的。下面用pageinspect这个插件对brin索引进行下简单的分析。

创建测试表,安装pageinspect,创建brin索引。

postgres=# create extension pageinspect;
CREATE EXTENSION
postgres=# create table a(id int);
CREATE TABLE
postgres=# insert into a select generate_series(1,3000000);
INSERT 0 3000000
postgres=# create index ix_a_id_brin on a using brin(id) with (pages_per_range=128);

CREATE INDEX

下面看下要用到的pageinspect的函数


postgres=# df public.brin*

                                                                                                           List of functions

Schema | Name | Result data type | Argument data types

                                                                             |  Type  
public brin_metapage_info record page bytea, OUT magic text, OUT version integer, OUT pagesperrange integer, OUT lastrevmappage bigi
nt normal
public brin_page_items SETOF record page bytea, index_oid regclass, OUT itemoffset integer, OUT blknum integer, OUT attnum integer, OUT
allnulls boolean, OUT hasnulls boolean, OUT placeholder boolean, OUT value text normal
public brin_page_type text page bytea
normal
public brin_revmap_data SETOF tid page bytea, OUT pages tid

(4 rows)

brin_page_type这个是查看索引页面类型的,主要有三种类型meta,revmap和regular,因为这个索引只有三个页面所以只看了0,1,2这三个页面。


postgres=# select * from brin_page_type(get_raw_page('ix_a_id_brin',0));

brin_page_type

meta
(1 row)

postgres=# select * from brin_page_type(get_raw_page('ix_a_id_brin',1));

brin_page_type

revmap
(1 row)

postgres=# select * from brin_page_type(get_raw_page('ix_a_id_brin',2));

brin_page_type

regular
(1 row)
postgres=# select relpages from pg_class where relname='ix_a_id_brin';

relpages

    3

(1 row)

下面看下这三个页面都是存的什么数据。

meta页面

postgres=# select * from brin_metapage_info(get_raw_page('ix_a_id_brin',0));

magic version pagesperrange lastrevmappage
0xA8109CFA 1 128 1

这个是说这个brin索引记录128个块中值得范围大小,最后一个revmap页面是1号页面。和之前查看页面类型页面号对应。

revmap页面

postgres=# select * from brin_revmap_data(get_raw_page('ix_a_id_brin',1)) limit 10;

pages

(2,1)
(2,2)
(2,3)
(2,4)
(2,5)
(2,6)
(2,7)
(2,8)
(2,9)
(2,10)
(10 rows)
postgres=# select * from brin_revmap_data(get_raw_page('ix_a_id_brin',1)) offset 100 limit 10;

pages

(2,101)
(2,102)
(2,103)
(2,104)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(10 rows)
postgres=# select count(1) from brin_revmap_data(get_raw_page('ix_a_id_brin',1)) ;

count

1360
(1 row)
postgres=# select relpages from pg_class where relname='a';

relpages

13275

(1 row)

revmap页面能存储1360条记录,可以看到最后一条记录是104,这个104是怎么算的呢?
首先查出a表一共的页面数13275,brin索引的每条记录对应128个块,13275/128=103.7,所以是104。
这个还可以看出索引条目在regluar页面的分布情况,因为我测试的记录条数较少,所以都在2号regluar页面上。

regluar页面

postgres=# select * from brin_page_items(get_raw_page('ix_a_id_brin',2),'ix_a_id_brin') limit 10;

(10 rows)
postgres=# select * from brin_page_items(get_raw_page('ix_a_id_brin',2),'ix_a_id_brin') offset 94 limit 10;

(10 rows)

blknum是该索引记录对应的起始页面编号,第一条就是0,第二条就是128。attnum是指存放第几个字段的意思,我只有一个字段所以都是1,allnulls表示是不是都是空值,hasnulls表示是否存在空值。value就是记录索引对应的128个数据块中数据的最大值和最小值。

目录
相关文章
|
1月前
|
人工智能 缓存 移动开发
秒悟meoo官网:套餐费用、秒悟积分使用、AI模型扣费标准、支持功能及问题解答
秒悟Meoo是阿里云推出的AI应用创作平台,支持一句话生成网页、H5、PPT及数据可视化,零代码门槛。提供免费版、Pro版(9.9元/月限时)、Max版(89元/月),含积分体系、多模型调用与一键部署功能。
636 1
|
1月前
|
人工智能 JavaScript 开发工具
DeepSeek Harness完整实操入门:Cordis插件内核、本地部署、SDK开发、模式选型与排坑全解
DeepSeek Harness是开源Agent运行时底座,打通大模型推理能力和本地文件、系统命令执行环境。依托Cordis插件内核,实现极高的可扩展能力,强化本地权限管控与完整执行链路可追溯。它并不是拿来直接聊天的成品软件,而是供开发者搭建、调试、评测智能体的底层底座。
325 0
|
2月前
|
人工智能 自然语言处理 算法
GEO 生成式引擎优化通俗解读:重新理解 AI 搜索引擎优化的底层逻辑
本文通俗解析GEO(生成式引擎优化)——面向AI大模型的新型内容优化体系。对比传统SEO,GEO聚焦内容能否被大模型“看见、信任、引用”,强调事实准确、结构清晰、多源可信。厘清误区,拆解检索、甄别、生成三阶段逻辑,助力从业者构建AI时代的内容竞争力。(239字)
318 1
|
3月前
|
弹性计算 缓存 运维
阿里云ECS磁盘空间满了处理教程:从诊断到扩容的一线经验
ECS 实例突然写入失败、网站报 503 或数据库连接不上,运维群里最常跳出的截图就是 df -h 里那行触目惊心的 Use% 100%。阿里云的云盘扩容不算复杂,但真正让业务停摆的,往往不是扩容本身有多难,而是事前没做分层监控、事后清理时又不小心踩了 inode 耗尽或文件句柄占用的坑。这篇教程不会把 100 篇文档重复一遍,而是直接聚焦三个关键动作:诊断真实占用源、安全清理大文件,以及在线扩容到文件系统生效的全链路。
547 1
|
4月前
|
人工智能 缓存 IDE
多模型统一订阅:阿里云百炼Token Plan团队版全场景使用手册
阿里云百炼平台推出Token Plan团队版,面向企业、研发团队打造标准化AI订阅服务,解决团队成员单独开通模型接口带来的成本散乱、用量无法统一管控、多模型切换繁琐、数据合规无保障等行业痛点。整套服务以统一Credits作为消耗计量单位,兼容文本、图像全系列大模型,配套完整团队权限管理体系,同时适配各类编程、AI智能体工具,本文从产品定位、套餐分级、计费抵扣规则、团队管理流程、工具接入、成本优化、同类产品差异、常见问题八个维度完整拆解,覆盖企业选型与落地全流程。
451 2
|
4月前
|
Oracle 关系型数据库 分布式数据库
云原生数据库PolarDB(兼容Oracle)从零到一:架构解析、实战部署与Oracle语法完全指南
本文系统讲解阿里云云原生数据库PolarDB PostgreSQL版(兼容Oracle)的核心架构与实战使用。首先剖析计算存储分离的Shared Everything架构,解读一写多读集群、自动读写分离和秒级弹性扩缩容的技术原理。随后从零开始演示集群创建、网络安全配置、数据库账号权限管理及三种主流连接方式。在SQL语法部分,详细展开建表语句、NUMBER/VARCHAR2/DATE等Oracle兼容数据类型、基础DML操作、高级查询(多表连接、聚合、子查询、序列)、事务管理与隔离级别。深入讲解PL/SQL编程的完整体系:存储过程与函数创建、异常处理(预定义异常、自定义异常、PRAGMA_EXC
|
3月前
|
缓存 人工智能 API
阿里云Qwen3.7-Plus模型价格表(输入输出/缓存/工具调用)及100万免费额度
阿里云Qwen3.7-Plus是中高性价比旗舰多模态智能体模型,支持文本/图片/视频输入与文本输出,具备GUI操作、视觉编程等“看想写做验”闭环能力。当前享输入1.6元/百万tokens、输出6.4元/百万tokens(8折),新用户赠100万免费Tokens。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
722 0
|
5月前
|
存储 人工智能 分布式计算
多Agent集群协作架构设计:路由、委托、辩论、群体四种模式的边界与枢衡实践
在供应链决策等复杂场景中,单体Agent的认知宽度与长任务专注度存在明显瓶颈。本文基于枢衡智能体集群从v1.0到终局的完整演进历程,从工程约束与架构响应的视角,重新定义路由、委托、辩论、群体四种协作模式的适用边界与通信拓扑,并给出关键架构决策与量化实践数据。
|
4月前
|
机器学习/深度学习 存储 新能源
K-3016L 高性能双组份环氧灌封胶技术解析:从导热机制到工程应用的全方位指南
K-3016L是高性能双组份环氧灌封胶,导热系数1.85 W/m·K、体积电阻率≥10¹⁶ Ω·cm、固化收缩率≤0.8%,兼具高导热、高绝缘与低应力特性,适用于新能源汽车电控、IGBT模块、光伏逆变器等功率电子器件灌封保护。(239字)
564 0
|
4月前
|
数据采集 JSON 监控
小红书评论 API 接口详解与实战开发
小红书作为生活方式、美妆穿搭、母婴家居等领域的核心内容平台,其笔记评论区沉淀了大量真实用户反馈、种草痛点、消费决策、品牌口碑信息。 对品牌方、运营团队、数据服务商而言,评论数据可用于: