怎么使用PostgreSQL中Hash索引
本篇内容介绍了“怎么使用PostgreSQL中Hash索引”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
逻辑结构
可以把Hash Index理解为一个Hash Table,每个Hash bucket存储根据Hash Function计算得到的对应的索引条目,为了节省空间,Hash索引条目只存储Hash Code(即Hash Value) + TID而不存储Hash Key(即索引键值),扫描索引后还必须读取相应的数据表行,因此Index Only Scan不适用于Hash Index.
testdb=# drop table if exists t_idx1;
DROP TABLE
testdb=# create table t_idx1(id int,c1 varchar(20));
CREATE TABLE
testdb=# create index idx_t_idx1_id on t_idx1 using hash(id);
CREATE INDEX
testdb=# insert into t_idx1 select generate_series(1,100000);
INSERT 0 100000
testdb=# analyze t_idx1;
ANALYZE
testdb=# explain verbose select * from t_idx1 where id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using idx_t_idx1_id on public.t_idx1 (cost=0.00..8.02 rows=1 width=62)
Output: id, c1
Index Cond: (t_idx1.id = 1)
(3 rows)
testdb=# -- 不能实现Index Only Scan
testdb=# explain verbose select id from t_idx1 where id = 100;
QUERY PLAN
-----------------------------------------------------------------------------------
Index Scan using idx_t_idx1_id on public.t_idx1 (cost=0.00..8.02 rows=1 width=4)
Output: id
Index Cond: (t_idx1.id = 100)
(3 rows)
而普通的B-Tree索引是可以Index Only Scan的:
testdb=# create table t_idx2(id int,c1 varchar(20));
CREATE TABLE
testdb=# insert into t_idx2 select generate_series(1,100000);
INSERT 0 100000
testdb=# create index idx_t_idx2_id on t_idx2 using btree(id);
CREATE INDEX
testdb=# analyze t_idx2;
ANALYZE
testdb=# explain verbose select id from t_idx2 where id = 100;
QUERY PLAN
----------------------------------------------------------------------------------------
Index Only Scan using idx_t_idx2_id on public.t_idx2 (cost=0.29..8.31 rows=1 width=4)
Output: id
Index Cond: (t_idx2.id = 100)
(3 rows)
有四种页面,分别是Meta page,Bucket Page,Overflow page和Bitmap page.
页面类型 | 说明 |
---|---|
Meta page | page number zero, which contains information on what is inside the index. |
Bucket pages | main pages of the index, which store data as «hash code — TID» pairs. |
Overflow pages | structured the same way as bucket pages and used when one page is insufficient for a bucket |
Bitmap pages | which keep track of overflow pages that are currently clear and can be reused for other buckets |
使用pageinspect插件可查看index中的相关信息
testdb=# select hash_page_type(get_raw_page('idx_t_idx1_id',0));
hash_page_type
----------------
metapage
(1 row)
testdb=# select hash_page_type(get_raw_page('idx_t_idx1_id',1));
hash_page_type
----------------
bucket
(1 row)
testdb=# \x
Expanded display is on.
testdb=# select * from hash_page_stats(get_raw_page('idx_t_idx1_id',1));
-[ RECORD 1 ]---+-----------
live_items | 189
dead_items | 0
page_size | 8192
free_size | 4368
hasho_prevblkno | 256
hasho_nextblkno | 4294967295
hasho_bucket | 0
hasho_flag | 2
hasho_page_id | 65408
testdb=# select * from hash_page_stats(get_raw_page('idx_t_idx1_id',2));
-[ RECORD 1 ]---+-----------
live_items | 201
dead_items | 0
page_size | 8192
free_size | 4128
hasho_prevblkno | 257
hasho_nextblkno | 4294967295
hasho_bucket | 1
hasho_flag | 2
hasho_page_id | 65408
“怎么使用PostgreSQL中Hash索引”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341