本文主要是介绍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 索引内部结构验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!