哈希索引(PostgreSQL 14 Internals翻译版)

概览

哈希索引提供了根据特定索引键快速查找tuple ID (TID)的功能。粗略地说,它只是一个存储在磁盘上的哈希表。哈希索引唯一支持的操作是根据相等条件进行搜索

当一个值插入到索引中时,将计算索引键的哈希函数。PostgreSQL哈希函数返回32位或64位整数;这些值中最低的几个位用作相应桶的编号。将TID和键的哈希码添加到所选的桶中。键本身不存储在索引中,因为这样处理固定长度的小值更方便。

索引的哈希表是动态扩展的。桶的最小数量是两个。随着索引元组数量的增长,其中一个存储桶被分成两个。该操作使用了多一位哈希码,因此元素仅在拆分产生的两个桶之间重新分布;哈希表的其他桶的组成保持不变。

索引搜索操作计算索引键和对应桶号的哈希函数。在所有桶内容中,搜索将只返回那些与键的哈希码对应的TID。由于bucket元素是按键的哈希码排序的,因此二进制搜索可以非常有效地返回匹配的TID。

由于键不存储在哈希表中,因此索引访问方法可能会由于哈希冲突而返回冗余的tid。因此,索引引擎必须重新检查访问方法获取的所有结果。出于同样的原因,不支持仅索引扫描

页面布局

与常规哈希表不同,哈希索引存储在磁盘上。因此,必须将所有数据安排到页中,最好是这样一种方式,即索引操作(搜索、插入、删除)需要访问尽可能少的页。

哈希索引使用四种类型的页面:

  • metapage—提供索引“目录”的页零
  • bucket pages—索引的主要页面,每个bucket一个
  • overflow pages—当主桶页不能容纳所有元素时使用的附加页
  • bitmap pages—包含位数组的页面,用于跟踪已被释放并可被重用的溢出页面

我们可以使用pageinspect扩展查看索引页。

让我们从一张空表开始:

在这里插入图片描述

我已经分析了表,因此创建的索引将具有尽可能小的大小;否则,将根据表包含10个页面的假设选择桶的数量。

索引包含四个页面:元页面,两个桶页面和一个位图页面(一次创建以备将来使用):

在这里插入图片描述

元页面包含有关索引的所有控制信息。我们现在只对几个值感兴趣:

在这里插入图片描述

每个桶的估计行数显示在ffactor字段中。该值是根据块大小和fillfactor存储参数值计算得出的。通过绝对统一的数据分布和没有散列冲突,您可以使用更高的填充因子值,但在实际数据库中,它会增加页面溢出的风险。

对于散列索引来说,最糟糕的情况是当一个键被重复多次时,数据分布出现很大的倾斜。由于哈希函数将返回一个相同的值,因此所有数据将被放置到相同的桶中,并且增加桶的数量不会有帮助。

现在索引为空,如ntuples字段所示。让我们通过插入具有相同索引键值的多行来导致桶页溢出。索引中出现溢出页:

在这里插入图片描述

综合所有页面的统计数据,桶0是空的,而所有的值都被放到了桶1中:其中一些位于主页面,不适合的可以在溢出页中找到。

在这里插入图片描述

很明显,如果同一个bucket的元素分布在几个页面上,性能将受到影响。如果数据分布是均匀的,散列索引将显示最佳结果。

现在让我们来看看如何分割桶。当索引中的行数超过可用桶的估计因子值时,就会发生这种情况。这里我们有两个桶,因子是307,所以它将在第615行插入索引时发生:

在这里插入图片描述
maxbucket值已经增加到2:现在我们有三个桶,编号从0到2。但是,尽管我们只添加了一个桶,页面的数量却翻了一番:

在这里插入图片描述
其中一个新页面由bucket 2使用,而另一个页面保持空闲状态,一旦出现就会被bucket 3使用。

在这里插入图片描述
在这里插入图片描述
因此,从操作系统的角度来看,哈希索引是快速增长的,尽管从逻辑的角度来看哈希表是逐渐增长的。

为了在一定程度上平衡这种增长并避免一次分配过多的页面,从第10次增加开始,将页面分配为四个相等的批次,而不是一次分配所有的页面。

元页面的另外两个字段实际上是位掩码,提供了桶地址的详细信息:

在这里插入图片描述
桶号由与高掩码对应的哈希码位定义。但是如果接收到的桶号不存在(超过maxbucket),则采用低掩码位。在这个特殊的例子中,我们取两个最低的位,得到0到3的值;但是如果我们得到3,我们只会取一个最低的位,也就是说,用桶1代替桶3。

每次大小增加一倍时,新的桶页被分配为单个连续块,而溢出页和位图页则根据需要插入这些片段之间。元页面保留插入到备件数组中每个块中的页面数,这使我们有机会使用简单的算术根据桶号计算其主页的数量。

在这个特殊的例子中,第一次增加之后插入了两个页面(一个位图页面和一个溢出页面),但是在第二次增加之后没有发生新的添加:

在这里插入图片描述
当指向死元组的指针被删除时,索引页中的空间将被释放。它发生在页面修剪期间(在尝试将元素插入完全填充的页面时触发)或执行常规真空时。

但是,哈希索引不能缩小:一旦分配,索引页将不会返回给操作系统。主页被永久地分配到它们的bucket中,即使它们根本不包含任何元素;清除的溢出页在位图中被跟踪,并且可以被重用(可能由另一个桶)。减小索引物理大小的唯一方法是使用REINDEX或
VACUUM FULL命令。

查询计划没有索引类型的指示:

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广西建筑模板的材质类型和特点有哪些?

广西建筑模板常用的材质类型包括木模板、钢模板、竹胶合板、塑料模板和铝合金模板等。每种材质都具有不同的特点和适用范围。 1. 木模板: - 适用于高层建筑的水平模板、剪力墙、竖向墙板、高架桥、立交桥、大坝、隧道施工及梁柱模板。 - 具有高强度和良好的韧性&…

AUTOSAR通信篇 - CAN网络通信(七:Nm)

文章目录 基础功能NM协调器功能NM协调器功能的适用性保持协调总线活动总线关闭的协调嵌套子总线的协调关闭定时器的计算同步用例1 – 同步指令同步用例2-同步启动同步用例3 -同步网络睡眠示例 唤醒和中止协调关闭外部的网络唤醒协调唤醒协调关闭的中止 部分网络功能PNC位向量过…

从零开始 Spring Cloud 15:多级缓存

从零开始 Spring Cloud 15:多级缓存 多级缓存架构 传统的缓存使用 Redis,大致架构如下: 这个架构存在一些问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时,会对数据库产生冲…

IP地址SSL证书 IP证书

在许多企业用例中,公司需要SSL证书作为IP地址。公司使用IP地址通过Internet访问各种类型的应用程序。 公网IP地址的SSL证书: 内部IP(也称为私有IP)是IANA设置为保存的IPv4或IPv6地址,例如: RFC 1918范围内…

openGauss学习笔记-107 openGauss 数据库管理-管理用户及权限-三权分立

文章目录 openGauss学习笔记-107 openGauss 数据库管理-管理用户及权限-三权分立107.1 默认的用户权限107.2 三权分立较非三权分立权限变化说明 openGauss学习笔记-107 openGauss 数据库管理-管理用户及权限-三权分立 默认权限机制和管理员两节的描述基于的是openGauss创建之初…

独立产品灵感周刊 DecoHack #053 - 有意思的地图网站

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 周刊继续发布 ❤️ 💻 产品推…

部署Vue项目到githubPage中

上传Vue项目到githubPage 例如: 看我发布的地址 前提条件 1. github上有一个仓库并且仓库下有两个分支(main 和 gh-pages) 1.1 main分支保存你的vue项目源码(react或者其他框架的都行) 1.2 gh-pages分支保存的是你…

【C++入门篇】保姆级教程篇【上】

目录 一、第一个C程序 二、C命名空间 1)什么是命名空间? 2)命名空间的使用 3) std库与namespace展开 4)命名空间的嵌套使用 三、输入输出方式 四、缺省参数 1)什么是缺省参数? 2&#xff0…

未能为 SSL/TLS 安全通道建立信任关系

在 Windows早期版本(Windows server 2008)上运行web请求相关代码,提示错误:未能为 SSL/TLS 安全通道建立信任关系。 打开IE直接访问相关网址,按照提示信任网站,安装证书: 选择:将所有…

【计算机网络】NAT机制的工作流程

网络地址转换(NAT)是一种将私有IP地址转换为公共IP地址的技术,它使得私有网络中的主机可以在互联网上与外部主机进行通信。NAT机制在路由器或专用NAT设备上配置,可以用于家庭、小型企业或大型企业的网络环境中。本文将总结NAT机制…

0基础学习VR全景平台篇第112篇:控制点和遮罩工具 - PTGui Pro教程

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 前情回顾:上节,我们用PTGui拼接了一张全景图,全景编辑器里的各项功能帮助我们进行了初步的检查和编辑。 之后我们需要使用【控制点】和【遮罩…

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二:人脸表情识别-VGG16实现 本文为🔗小白入门Pytorch内部限免文章 参考本文所写记录性文章,请在文章开头注明以下内容,复制粘贴即可 🍨 本文为🔗小白入门Pytorch中的学习记录博客🍦 参…

华为数通方向HCIP-DataCom H12-831题库(多选题:21-40)

第21题 网络管理员A希望使用ACL匹配特定的路由条目,请问以下哪些路由条目将被图中的ACL规侧匹配? acl number 2000 rule 10 permit source 10.0.0.0 0.0.6.0A、10.0.0.1/32 B、10.0.0.0/24 C、10.0.1.0/24 D、10.0.2.0/24 答案: 解析: 通配符十进制6转换二进制为00000110,…

提升药店效率:山海鲸医药零售大屏的成功案例

在医药行业中,特别是医药零售领域,高效的药品管理和客户服务至关重要。随着科技的飞速发展,数字化解决方案已经成为提高医药零售管控效率的有效工具之一。其中,医药零售管控大屏作为一种强大的工具,正在以独特的方式改…

互联网Java工程师面试题·Spring篇·第二弹

目录 3、Beans 3.1、什么是 spring bean? 3.2、spring 提供了哪些配置方式? 3.3、spring 支持集中 bean scope? 3.4、spring bean 容器的生命周期是什么样的? 3.5、什么是 spring 的内部 bean? 3.6、什么是 spri…

ONEPIECE!程序环境和预处理——C语言最终章

时间过得飞快呀,从第一篇blog到现在,已经有三四个月的时间了,而我们终于也迎来了C语言的最终章——程序环境和预处理!加油吧朋友们,ONEPIECE就在眼前~ 目录 一、程序的"翻译环境"和"运行环境" 二…

Biotech - 环状 mRNA 的 LNP 递送系统 与 成环框架

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/133992971 环状 RNA(或 circRNA )是一种单链 RNA,与线性 RNA 不同,形成一个共价闭合的连续环。在环…

Hadoop+Hive+Spark+Hbase开发环境练习

1.练习一 1.数据准备 在hdfs上创建文件夹,上传csv文件 [rootkb129 ~]# hdfs dfs -mkdir -p /app/data/exam 查看csv文件行数 [rootkb129 ~]# hdfs dfs -cat /app/data/exam/meituan_waimai_meishi.csv | wc -l 2.分别使用 RDD和 Spark SQL 完成以下分析&#xf…

零代码编程:用ChatGPT多线程批量将PDF文档转换为word格式

pdf2docx是Python的一个库,可以很方便的将PDF文档转换为word格式,首先安装这个库。 然后在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个文档格式转换的任务,具体步骤如下: 打开F盘的Books文件…

强化学习代码实战(1)

机器人领域:控制,规划,感知等都可以用,可以把它作为一个优化过程,那么任何需要优化的问题都可以用它解决。 1.应用 深度学习:智能感知,解决智能如何理解这个世界的问题。 强化学习&#xff1a…