【PGCCC】Postgresql BRIN 索引原理
前言
postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。
原理
postgresql 按照一定的数目(默认 128, 可以通过 pages_per_range 指定),将相邻的数据 Block 分成一组,然后计算它的的取值范围。当需要查看数据时,会先遍历这些取值范围。当要查找的数据不在此范围内,则可以直接跳过这些数据 Block。
当数据按照一定规则新增时,比如监控数据,数据的查找会非常高效。而且块级索引的空间占用会很小,多个相邻的Block才会对应一条索引记录。
如果数据排列的比较随机时,那么索引效果就非常差,因为它起不到快速筛除不符合的数据 Block。造成数据排列乱的原因,还有频繁的删除数据,因为 postgresql 会将删除空间回收掉,后续的数据新增都会填补这些空间。虽然可以配置删除的数据不会回收,但是会造成存储空间浪费,所以块级索引还不适合频繁删除数据的场景。
存储结构
BRIN 也是通过 Page 为基本单位来存储数据的,它有三种类型的 Page, 排列如下图所示:
BRIN 的第一个 Page 是 Meta Page,它存储了整个索引的元信息。数据定义如下:
typedef struct BrinMetaPageData
{uint32 brinMagic; // 标识符uint32 brinVersion; // 版本号BlockNumber pagesPerRange; // 每个范围包含了多少个原始数据的pageBlockNumber lastRevmapPage; // 最大 revmap 的page number
} BrinMetaPageData;
紧接着 Meta Page 后面的是 Range Map Page,它相当于一个 ItemPointerData 数组,可以快速的根据源数据来查找到索引数据。如下图所示,每128个 block 会计算一次汇总信息:
我们如果想要找到源数据块 block 238 对应的索引数据,首先计算出它对应第几组,即 238 / 128 = 1。然后每个 Range Map Page 包含的数量是一定的(记为 REVMAP_PAGE_MAXITEMS),最终计算出它对应第几个 Range Map Page, 即 1 / REVMAP_PAGE_MAXITEMS = 0,在这个 Page 的偏移量是 1 % REVMAP_PAGE_MAXITEMS = 1。
计算的公式如下:
targetblk = HEAPBLK_TO_REVMAP_BLK(revmap->rm_pagesPerRange, heapBlk) + 1 // 这里加1是指 meta page// 计算第几个Range Map Page, REVMAP_PAGE_MAXITEMS表示一个 Page 包含的 ItemPointData 数目
#define HEAPBLK_TO_REVMAP_BLK(pagesPerRange, heapBlk) ((heapBlk / pagesPerRange) / REVMAP_PAGE_MAXITEMS) // 计算 Page 里的偏移量
#define HEAPBLK_TO_REVMAP_INDEX(pagesPerRange, heapBlk) ((heapBlk / pagesPerRange) % REVMAP_PAGE_MAXITEMS)
Range Map Page 存储的是指向BrinTuple的位置,注意到BrinTuple的存储并没有按照 block number 排序的 。BrinTuple存储在 Regular Page 里,它存储的数据格式如下:
bt_blkno 指向所属 BLock Range 的第一个 Block
bt_info 是一个 uint8 类型,第8位表示是否包含 null 值,1到4位表示 values 的偏移量。
all_nulls 表示值是否都为 null
has_nulls 表示值是否有null
values 表示索引字段的范围
数据更新
数据新增
当数据新增时,postgresql 并不一定会更新块级索引。如果开启了 autosummarize(默认为关闭,在创建索引可以指定),那么在填满了一个 Range Block(默认是 128 个),再触发一次新增的时候,才会发送 autosummarize 请求给 autovaccum 进程。还需要注意到,如果请求队列满了,该 autosummarize 请求会被丢弃的。除此之外,索引的更新只能通过 vaccum 或者用户主动调用 brin_summarize_new_values 函数执行。
如果数据新增是在已有的 block 上,比如postgresql 将之前被删除的数据回收掉,新的数据被添加进来了,那么这时就会更新索引。如果新增的数据,在原来的范围内,就不会做任何操作。
数据删除
当数据被删除时,postgresql 不会更新索引。因为这种操作非常耗时,如果删除的数据刚好在范围边界,那么需要扫描整个 Range Block,才能计算出来,所以 postgresql 会等到 vacuum 时才会处理,况且这种情况并不会影响结果的准确性,只是扫描了多余的数据。
数据更新
postgresql 更新数据,本质是先删除数据然后新增数据,所以对于索引的影响同上面一样。
作者:zhmin
链接:https://zhmin.github.io/posts/postgresql-block-range-index/
#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证
相关文章:
【PGCCC】Postgresql BRIN 索引原理
前言 postgresql 提供了块级索引(简称 BRIN),主要适用于类似时序数据之类的,有着天然的顺序,而且都是添加写的场景。相比于 btree 索引,它的体积小得多,非常适用于大数据量的场景。 原理 pos…...
安全加固方案
交换机安全加固 查看是否关闭未使用的接口 25GE1/0/1、25GE1/0/47、25GE1/0/48需要使用,暂不关闭 system-view # interface Eth-Trunk99 shutdown quit interface Eth-Trunk100 shutdown quit interface Eth-Trunk110 shutdown quit interface 25GE1/…...
Adobe Illustrator 2024 安装教程与下载分享
介绍一下 下载直接看文章末尾 Adobe Illustrator 是一款由Adobe Systems开发的矢量图形编辑软件。它广泛应用于创建和编辑矢量图形、插图、徽标、图标、排版和广告等领域。以下是Adobe Illustrator的一些主要特点和功能: 矢量绘图:Illustrator使用矢量…...
WSL安装不同版本ubuntu(已有ubuntu20.04,再装ubuntu18.04)
参考: 如何在 WSL 中删除指定版本的 Ubuntu(以删除 Ubuntu 22.04 为例)_wsl卸载某个-CSDN博客 已有ubuntu20.04,现在再安装一个ubuntu18.04 直接参考下面我写的链接的第四步,前面的步骤都不需要再做了 Win11安装WSL…...
指针测试总结(一)(一维数组)
1.取一维数组的首地址 int main() {int arr[3] {5,8,1}; printf("%d\n",arr);printf("%d\n",&arr);printf("%d\n",&arr[0]);printf("%d\n",&arr0); }输出结果: 1096809108 1096809108 1096809108 1096809108…...
CentOS环境上离线安装python3及相关包
0. 准备操作系统及安装包 准备操作系统环境: 首先安装依赖包,安装相应的编译工具 [rootbigdatahost bin]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-d…...
Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程
clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…...
算法笔记:回溯算法
回溯法理论基础 「回溯是递归的副产品,只要有递归就会有回溯」,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。 回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一…...
[工具分享] 根据Excel数据根据Word文档模板,批量创建生成Word文档并重命名,方便快速查找打印
前几天交楼的小姐姐要多份Word文档合同打印给客户,那么100份就需要修改100次 上面好多都是模板的制式文件,里面的部分数据都是要根据实际值来变动的, 那么有没有快速的方法来操作呢,还是只能一个个手动的改,又容易出…...
数据库的联合查询
数据库的联合查询 简介为什么要使⽤联合查询多表联合查询时MYSQL内部是如何进⾏计算的构造练习案例数据案例:⼀个完整的联合查询的过程 内连接语法⽰例 外连接语法 ⽰例⾃连接应⽤场景示例表连接练习 ⼦查询语法单⾏⼦查询多⾏⼦查询多列⼦查询在from⼦句中使⽤⼦查…...
DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?
概述 在数字医学影像处理中,CR(Computed Radiography,计算机放射摄影)和DR(Digital Radiography,数字放射摄影)技术广泛应用于医疗影像获取与分析。然而,临床实践中常常遇到这样一个问题:部分CR/DR图像在默认打开时呈现为反色(即负片效果),需手动反色后才能正常阅片…...
C#基础上机练习题
21.计算500-800区间内素数的个数cn,并按所求素数的值从大到小的顺序排列,再计算其间隔加、减之和,即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求,把结果cn和sum输出。 22.在三位整数…...
UE5 实现组合键触发事件的方法
因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下,发现键盘事件里根本就没有{}这两个键。 花费了一下午,终于找到解决的方法了,也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …...
Linux麦克风录音实战
在 Linux 上使用麦克风进行录音可以通过多种方式实现,包括使用命令行工具、图形界面应用程序以及编程接口。下面我将介绍几种常见的方法,从简单的命令行工具到使用 PortAudio 库进行编程。 一. 使用arecord命令行工具 arecord 是 ALSA(Adva…...
Diving into the STM32 HAL-----Timers笔记
嵌入式设备会按时间执行某些活动。对于真正简单且不准确的延迟,繁忙的循环可以执行任务,但是使用 CPU 内核执行与时间相关的活动从来都不是一个聪明的解决方案。因此,所有微控制器都提供专用的硬件外设:定时器。定时器不仅是时基生…...
RPC学习
一、什么是 RPC RPC(Remote Procedure Call),即远程过程调用,是一种计算机通信协议,它允许运行在一台计算机上的程序调用另一台计算机上的子程序或函数,就好像调用本地程序中的函数一样,无需程序…...
STM32端口模拟编码器输入
文章目录 前言一、正交编码器是什么?二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…...
深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
MyBatis 是目前 Java 开发中常用的一种 ORM(对象关系映射)框架,它不仅简化了 SQL 语句的编写和管理,还提供了强大的缓存机制,用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存,分别应用于不…...
做一个FabricJS.cc的中文文档网站——面向markdown编程
📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电&#…...
Elasticsearch在部署时,对Linux的设置有哪些优化方法?
大家好,我是锋哥。今天分享关于【Elasticsearch在部署时,对Linux的设置有哪些优化方法?】面试题。希望对大家有帮助; Elasticsearch在部署时,对Linux的设置有哪些优化方法? 1000道 互联网大厂Java工程师 精…...
ThingsBoard规则链节点:Azure IoT Hub 节点详解
目录 引言 1. Azure IoT Hub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 设备管理 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台,提供了设备…...
SpringBoot线程池的使用
SpringBoot线程池的使用 在现代Web应用开发中,特别是在使用Spring Boot框架时,合理使用线程池可以显著提高应用的性能和响应速度。线程池不仅能够减少线程创建和销毁的开销,还能有效地控制并发任务的数量,避免因线程过多而导致的…...
ubuntu中使用ffmpeg和nginx推流rtmp视频
最近在测试ffmpeg推流rtmp视频,单独安装ffmpeg是无法完成推流的,需要一个流媒体服务器,常用nginx,可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx,仅使用基本功能: 1 安装ffmpeg …...
如何在CodeIgniter中添加或加载模型
在CodeIgniter框架中,模型(Model)是用于与数据库进行交互的重要组件。模型通常包含数据库查询、业务逻辑以及与数据库表相关的函数。以下是如何在CodeIgniter中添加或加载模型的步骤: 1. 创建模型文件 首先,你需要在…...
加菲工具 - 好用免费的在线工具集合
加菲工具 https://orcc.online AI 工具 加菲工具 集合了目前主流的,免费可用的ai工具 文档处理 加菲工具 pdf转word、office与pdf互转等等工具都有链接 图片图标 加菲工具 统计了好用免费的在线工具 编码解码 加菲工具 base64编码解码、url编码解码、md5计算…...
Centos 8, add repo
Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han...
神经网络12-Time-Series Transformer (TST)模型
Time-Series Transformer (TST) 是一种基于 Transformer 架构的深度学习模型,专门用于时序数据的建模和预测。TST 是 Transformer 模型的一个变种,针对传统时序模型(如 RNN、LSTM)在处理长时间依赖、复杂数据关系时的限制而提出的…...
在 Ubuntu 上安装 Yarn 环境
在 Ubuntu 上安装 Yarn 环境 步骤 1: 更新系统步骤 2: 安装 Node.js步骤 3: 安装 Yarn方法 1: 使用 npm 安装方法 2: 使用 APT 安装 步骤 4: 验证安装总结 在 Ubuntu 上安装 Yarn 环境可以通过以下步骤完成: 步骤 1: 更新系统 首先,确保你的系统是最新…...
OEM sql monitoring 类似SQL
不够OEM 全面 select a.inst_id,a.time_since_last_wait_micro,a.last_call_et,a.sql_id,a.sql_hash_value, a.username,a.pdml_enabled,a.pdml_status ,a.prev_sql_id from gv$session a where a.statusACTIVE and a.sql_id is not null and a.username is not null select …...
【数据分析】基于GEE实现大津算法提取洞庭湖流域水体
大津算法提取水体 1.写在前面2.洞庭湖水体识别1.写在前面 最大类间方差法,也称为Otsu或大津法,是一种高效的图像二值化算法,由日本学者Otsu于1979年提出。该算法基于图像的频率分布直方图,假设图像包含两类像素(前景和背景),并计算出一个最佳阈值,以最大化类间方差,从…...
MySQL中的ROW_NUMBER窗口函数简单了解下
ROW_NUMBER() 是 MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。这个顺序号是基于窗口函数的 ORDER BY 子句进行排序的,可以根据指定的排序顺序生成连续的整数值。 ROW_NUMBER() 在分页、去重、…...
pyhton django web集群基于linux定时任务
基于django management/commands目录下的脚本 from django.core.management import BaseCommand import logging import uuid from pia.utils.cache import reset_redis_expire from pia.utils.reids_key import TASK_KEYlogging logging.getLogger(task)""" …...
STM32串口——5个串口的使用方法
参考文档 STM32串口——5个串口的使用方法_51CTO博客_stm32串口通信的接收与发送 串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter)…...
友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!
2024年11月19日,第十三届中国创新创业大赛(广东广州赛区)暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍:广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛(广东广州赛区…...
react函数式组件中的路由传参方式
React Router 提供了多种方式来传递路由参数: URL 路径参数:通过动态路由和 useParams 获取。查询参数:通过 useLocation 获取 URL 查询字符串。路由状态传递:通过 state 属性在导航时传递数据,不在 URL 中显示&#…...
docker部署微信机器人实现任意群聊发送消息
前言:底层技术用的是wechaty,我只是做了一些集成。 此项目源码如下:https://gitee.com/yang123888/wechaty-wxtest 拉取: docker pull registry.cn-hangzhou.aliyuncs.com/yamyang/kercore-wx-bot:1.0.0运行: dock…...
Vercel 设置自动部署 GitHub 项目
Vercel 设置自动部署 GitHub 项目 问题背景 最近 Vercel 调整了其部署政策,免费版用户无法继续使用自动部署功能,除非升级到 Pro 计划。但是,我们可以通过配置 Deploy Hooks 来实现同样的自动部署效果。 解决方案 通过设置 Vercel 的 Dep…...
【shodan】(七)命令
shodan基础(七) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 查询账号 查看账户扫描次数 shodan info查询域名信息 shodan d…...
文件上传代码分析
目录 不同类型的语言脚本语⾔/解释型语⾔⼀次编译到处运⾏编译型语⾔ 不同语⾔的webshell上传差异脚本语⾔/解释型语⾔⼀次编译到处运⾏编译型语⾔ ⽂件上传到webshell任意⽂件上传js检测解析规则MIME⽂件头后缀检测失效 NTFS Tricks 不同类型的语言 脚本语⾔/解释型语⾔ 代表…...
深入解析分布式遗传算法及其Python实现
目录 深入解析分布式遗传算法及其Python实现目录第一部分:分布式遗传算法的背景与原理1.1 遗传算法概述1.2 分布式遗传算法的引入1.3 分布式遗传算法的优点与挑战优点:挑战:第二部分:分布式遗传算法的通用Python实现2.1 基本组件的实现第三部分:案例1 - 基于多种交叉与变异…...
World of Warcraft /script SetRaidTarget(“target“, n, ““) n=8,7,6,5,4,3,2,1,0
魔兽世界执行当前目标标记方法 /script SetRaidTarget("target", n, "") n8,7,6,5,4,3,2,1,0 解析这个lua脚本 D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns\wMarker wMarker.lua /script SetRaidTarget("target", 8, &quo…...
django authentication 登录注册
文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示ÿ…...
阿里云整理(一)
阿里云整理 1. 介绍规模 2. 专业名词2.1 专有网络VPC2.2 安全组SG2.3 云服务器ECS2.4 资源组2.5 部署集2.5 web测试 1. 介绍 阿里云是一家提供云计算和人工智能服务的科技公司,成立于2009年,总部位于杭州。它为全球客户提供全方位的云服务ÿ…...
鸿蒙NEXT开发案例:文字转拼音
【引言】 在鸿蒙NEXT开发中,文字转拼音是一个常见的需求,本文将介绍如何利用鸿蒙系统和pinyin-pro库实现文字转拼音的功能。 【环境准备】 • 操作系统:Windows 10 • 开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.…...
Redis高级
目录 Redis事务 语法错误 执行错误 Redis持久化 RDB持久化 RDB原理 小结 AOF持久化 AOF原理 AOF配置 AOF文件重写 RDB与AOF对比 Redis主从复制架构 搭建主从复制架构 在redis目录创建三个目录 把原来的redis.conf配置分件分贝复制一件到这三个目录中 修改配置文件…...
八股文-基础知识-面试题汇总(一)
面向对象和面向过程的区别? 面向对象和面向过程是两种不同的编程范式,它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目,尤其是需要维护和扩展的系统;而面向过程更适合小型、线性的任务或对性能要求…...
玩转合宙Luat教程 基础篇④——程序基础(库、线程、定时器和订阅/发布)
文章目录 一、前言二、库三、线程四、定时器五、订阅/发布5.1 回调函数5.2 堵塞等待一、前言 教程目录大纲请查阅:玩转合宙Luat教程——导读 写一写Lua程序基础的东西。 包括如何调用库,如何创建线程、如何创建定时器,如何使用订阅/发布事件。 二、库 程序从main.lua开始通…...
openssl颁发包含主题替代名的证书–SAN
原文地址:openssl颁发包含主题替代名的证书–SAN – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 在 X.509 证书中,commonName(CN)字段只能有一个值。如果让证书支持多个域名和IP地址,…...
Unity 2020、2021、2022、2023、6000下载安装
Unity 2020、2021、2022、2023、6000 下载安装 以Unity 6000.0.24fc1下载安装为例: 打开 https://unity.cn/ 优三缔 官方网站; 点击【产品列表】→点击【查看更多】→选择自己需要的版本→点【开始使用】 点击【从Unity Hub下载】 以Windows为例&am…...
Zustand:一个轻量级的React状态管理库
文章目录 前言一、安装Zustand二、使用Zustand三、实际案例结语 前言 在现代Web开发中,状态管理是一个常见的需求,特别是在构建大型或复杂的单页面应用程序(SPA)时。React等框架虽然提供了基本的状态管理功能,但对于复…...