本文主要介绍hash在postgresql索引中的使用的详细说明,有很好的参考价值,希望对大家有所帮助。来和边肖一起看看。
os: ubuntu 16.04
postgresql: 9.6.8
知识产权规划
192.168.56.102节点2 postgresql
帮助创建索引
postgres=# \h创建索引
Command:创建索引
描述:定义新索引
语法:
在表名[使用方法]上创建[唯一]索引[并发] [ [如果不存在]名称]
({ column _ name |(expression)}[COLLATE排序规则][op class][ASC | desc][NULLS { FIRSt | LAST }][,] )
[ WITH (storage_parameter=value [,] ) ]
[表空间_名称]
[ WHERE谓词]
[使用方法]
方法
要使用的索引方法的名称。你可以选择btree,hash,gist,spgist,gin和brin。默认方法是btree。
切碎
哈希只能处理简单的等价比较,
postgres=# drop table tmp _ t0
翻桌
postgres=# create table tmp _ t0(c0 varchar(100),C1 varchar(100));
创建表格
postgres=# insert into tmp_t0(c0,c1)从generate_series(1,100000)中选择MD5(id :3360 varchar)、MD5((id): varchar)作为id;
插入0 100000
postgres=#使用hash(c0)在tmp_t0上创建索引idx _ tmp _ t0 _ 1;
创建索引
postgres=# \d tmp_t0
表“public.tmp_t0”
列|类型|排序规则|可空|默认|存储|统计目标|描述
- - - - - - - -
c0 |字符变化(100) | | | |扩展| |
c1 |字符变化(100) | | | |扩展| |
索引:
idx_tmp_t0_1 '哈希(c0)
postgres=# explain select * from tmp _ t0,其中c0=' d3d 9446802 a 44259755d 38 E6 d 163 e 820 ';
查询计划
-
在tmp_t0上使用idx_tmp_t0_1进行索引扫描(成本=0.00.8.02行=1宽度=66)
索引Cond :((c0):3360 text=' d3d 9446802 a 44259755d 38 E6 d 163 e 820 ' : text)
(2行)
注意事项,官网特别强调:
散列索引操作目前不被WAL记录,所以有未写的修改。数据库崩溃后,需要用REINDEX命令重建哈希索引。
同样,初始基本备份完成后,对哈希索引的更改不会通过流式或基于文件的复制进行复制,因此它们会对以后使用它们的查询给出错误的答案。
由于这些原因,不再建议使用哈希索引。
补充:Postgresql哈希索引简介
哈希索引的结构
当数据被插入到索引中时,我们将通过哈希函数为这个索引键计算一个值。PostgreSQL中的Hash函数总是返回“整数”的类型,范围是2 ^ 3240亿。桶的数量最初是两个,然后动态增加以适应数据大小。可以使用位算法从散列码计算桶号。这个桶可以存放TID。