PG 索引内部结构验证

2024-06-04 21:04
文章标签 验证 索引 pg 内部结构

本文主要是介绍PG 索引内部结构验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

索引结构验证:

一层结构:

create table tab1(id int primary key,info text);insert into tab1 select generate_series (1,100),md5(random()::text);

创建一个表插入一百条数据。

对表进行分析:

vacuum analyze tab1;

查看meta层信息:

select * from bt_metap('tab1_pkey');

可以看到root块为1,当前有0层,有100条数据。

查看根块的统计:

select * from bt_page_stats('tab1_pkey',1);

可以看到btpo为0,是第0层。

所以这个根块既是根块又是页块 btpo_flags=2+1=3。

查看root(leaf)页里面的内容

select * from bt_page_items('tab1_pkey',1);

共100行。

可以通过ctid查询表。

二层结构:

插入大量数据使叶块分裂。

insert into tab1 select generate_series(101,10000),md5(random()::text);

查看meta层信息

此时可以看到 root为3,表明根块变成了第3块了(刚才根块是第一块),level=1,现在有两层,根块在第0层。

查看根块信息:

可以看到第三块是根块,btpo_flags=2.

查看根块里面的内容:

可以看到,根块里面现在存放的是叶块的指针。

再看一下刚才的第一个块。

可以看到,他变成叶块了,属于第0层。

查看页块的数据。

可以看到页块存放了实际的数据,这与B树的性质不谋而合。

三层结构:

继续插入数据,导入B树增长到3层。

insert into tab1 select generate_series(10001,1000000),md5(random()::text);

查看meta层信息:

根块变成第412块了,现在有三层(level=2)。

查看根块信息

查看根块内容

可以看到根块里面存放了枝块的指针。原来(3,0)是根块,现在变成枝块了。

看这个枝块的信息

他的标记变成0了,是一个枝块,属于第1层。

索引结构由autovacuum维护。

pg也支持hash索引:

这篇关于PG 索引内部结构验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031115

相关文章

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}