婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > postgresql 索引之 hash的使用詳解

postgresql 索引之 hash的使用詳解

熱門標簽:天津開發區地圖標注app 移動外呼系統模擬題 地圖標注要花多少錢 電話機器人怎么換人工座席 400電話申請客服 濟南外呼網絡電話線路 廣州電銷機器人公司招聘 江蘇400電話辦理官方 電銷機器人能補救房產中介嗎

os: ubuntu 16.04

postgresql: 9.6.8

ip 規劃

192.168.56.102 node2 postgresql

help create index

postgres=# \h create index
Command:   CREATE INDEX
Description: define a new index
Syntax:
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]
  ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
  [ WITH ( storage_parameter = value [, ... ] ) ]
  [ TABLESPACE tablespace_name ]
  [ WHERE predicate ]

[ USING method ]

method

要使用的索引方法的名稱??梢赃x擇 btree、hash、 gist、spgist、 gin以及brin。 默認方法是btree。

hash

hash 只能處理簡單的等值比較,

postgres=# drop table tmp_t0;
DROP TABLE
postgres=# create table tmp_t0(c0 varchar(100),c1 varchar(100));
CREATE TABLE
postgres=# insert into tmp_t0(c0,c1) select md5(id::varchar),md5((id+id)::varchar) from generate_series(1,100000) as id;
INSERT 0 100000
postgres=# create index idx_tmp_t0_1 on tmp_t0 using hash(c0);
CREATE INDEX
postgres=# \d+ tmp_t0
                     Table "public.tmp_t0"
 Column |     Type     | Collation | Nullable | Default | Storage | Stats target | Description 
--------+------------------------+-----------+----------+---------+----------+--------------+-------------
 c0   | character varying(100) |      |     |     | extended |       | 
 c1   | character varying(100) |      |     |     | extended |       | 
Indexes:
  "idx_tmp_t0_1" hash (c0)
postgres=# explain select * from tmp_t0 where c0 = 'd3d9446802a44259755d38e6d163e820';
                 QUERY PLAN                 
----------------------------------------------------------------------------
 Index Scan using idx_tmp_t0_1 on tmp_t0 (cost=0.00..8.02 rows=1 width=66)
  Index Cond: ((c0)::text = 'd3d9446802a44259755d38e6d163e820'::text)
(2 rows)

注意事項,官網特別強調:

Hash索引操作目前不被WAL記錄,因此存在未寫入修改,在數據庫崩潰后需要用REINDEX命令重建Hash索引。

同樣,在完成初始的基礎備份后,對于Hash索引的改變也不會通過流式或基于文件的復制所復制,所以它們會對其后使用它們的查詢給出錯誤的答案。

正因為這些原因,Hash索引已不再被建議使用。

補充:Postgresql hash索引介紹

hash索引的結構

當數據插入索引時,我們會為這個索引鍵通過哈希函數計算一個值。 PostgreSQL中的哈希函數始終返回“整數”類型,范圍為2^32≈40億。bucket桶的數量最初為2個,然后動態增加以適應數據大小??梢允褂梦凰惴◤墓4a計算出桶編號。這個bucket將存放TID。

由于可以將與不同索引鍵匹配的TID放入同一bucket桶中。而且除了TID之外,還可以將鍵的源值存儲在bucket桶中,但這會增加索引大小。為了節省空間,bucket桶只存儲索引鍵的哈希碼,而不存儲索引鍵。

當我們通過索引查詢時,我們計算索引鍵的哈希函數并獲取bucket桶的編號。現在,仍然需要遍歷存儲桶的內容,并僅返回所需的哈希碼匹配的TID。由于存儲的“hash code - TID”對是有序的,因此可以高效地完成此操作。

但是,兩個不同的索引鍵可能會發生以下情況,兩個索引鍵都進入一個bucket桶,而且具有相同的四字節的哈希碼。因此,索引訪問方法要求索引引擎重新檢查表行中的情況來驗證每個TID。

映射數據結構到page

Meta page - 0號page,包含索引內部相關信息

Bucket pages - 索引的主要page,存儲 “hash code - TID” 對

Overflow pages - 與bucket page的結構相同,在不足一個page時,作為bucket桶使用

Bitmap pages - 跟蹤當前干凈的overflow page,并可將其重新用于其他bucket桶

注意,哈希索引不能減​​小大小。雖然我們刪除了一些索引行,但是分配的頁面將不會返回到操作系統,只會在VACUUMING之后重新用于新數據。減小索引大小的唯一選項是使用REINDEX或VACUUM FULL命令從頭開始重建索引

接下來看下hash索引如何創建

demo=# create index on flights using hash(flight_no);
demo=# explain (costs off) select * from flights where flight_no = 'PG0001';
           QUERY PLAN           
----------------------------------------------------
 Bitmap Heap Scan on flights
  Recheck Cond: (flight_no = 'PG0001'::bpchar)
  -> Bitmap Index Scan on flights_flight_no_idx
     Index Cond: (flight_no = 'PG0001'::bpchar)
(4 rows)

注意:10版本之前hash索引不記錄到wal中,所以hash索引不能做recovery,當然也就不能復制了,但是從10版本以后hash所用得到了增強,可以記錄到wal中,創建的時候也不會再有警告。

查看hash訪問方法相關的操作函數

demo=# select  opf.opfname as opfamily_name,
     amproc.amproc::regproc AS opfamily_procedure
from   pg_am am,
     pg_opfamily opf,
     pg_amproc amproc
where  opf.opfmethod = am.oid
and   amproc.amprocfamily = opf.oid
and   am.amname = 'hash'
order by opfamily_name,
     opfamily_procedure;
  
   opfamily_name  |  opfamily_procedure  
--------------------+-------------------------
 abstime_ops    | hashint4extended
 abstime_ops    | hashint4
 aclitem_ops    | hash_aclitem
 aclitem_ops    | hash_aclitem_extended
 array_ops     | hash_array
 array_ops     | hash_array_extended
 bool_ops      | hashcharextended
 bool_ops      | hashchar
 bpchar_ops     | hashbpcharextended
 bpchar_ops     | hashbpchar
 bpchar_pattern_ops | hashbpcharextended
 bpchar_pattern_ops | hashbpchar
 bytea_ops     | hashvarlena
 bytea_ops     | hashvarlenaextended
 char_ops      | hashcharextended
 char_ops      | hashchar
 cid_ops      | hashint4extended
 cid_ops      | hashint4
 date_ops      | hashint4extended
 date_ops      | hashint4
 enum_ops      | hashenumextended
 enum_ops      | hashenum
 float_ops     | hashfloat4extended
 float_ops     | hashfloat8extended
 float_ops     | hashfloat4
 float_ops     | hashfloat8
 ...

可以用這些函數計算相關類型的哈希碼

hank=# select hashtext('zhang');
 hashtext  
-------------
 -1172392837
(1 row)
hank=# select hashint4(10);
 hashint4  
-------------
 -1547814713
(1 row)

hash索引相關的屬性

hank=# select a.amname, p.name, pg_indexam_has_property(a.oid,p.name)
hank-# from pg_am a,
hank-#   unnest(array['can_order','can_unique','can_multi_col','can_exclude']) p(name)
hank-# where a.amname = 'hash'
hank-# order by a.amname;
 amname |   name   | pg_indexam_has_property 
--------+---------------+-------------------------
 hash  | can_order   | f
 hash  | can_unique  | f
 hash  | can_multi_col | f
 hash  | can_exclude  | t
(4 rows)
hank=# select p.name, pg_index_has_property('hank.idx_test_name'::regclass,p.name)
hank-# from unnest(array[
hank(#    'clusterable','index_scan','bitmap_scan','backward_scan'
hank(#   ]) p(name);
   name   | pg_index_has_property 
---------------+-----------------------
 clusterable  | f
 index_scan  | t
 bitmap_scan  | t
 backward_scan | t
(4 rows)
hank=# select p.name,
hank-#   pg_index_column_has_property('hank.idx_test_name'::regclass,1,p.name)
hank-# from unnest(array[
hank(#    'asc','desc','nulls_first','nulls_last','orderable','distance_orderable',
hank(#    'returnable','search_array','search_nulls'
hank(#   ]) p(name);
    name    | pg_index_column_has_property 
--------------------+------------------------------
 asc        | f
 desc        | f
 nulls_first    | f
 nulls_last     | f
 orderable     | f
 distance_orderable | f
 returnable     | f
 search_array    | f
 search_nulls    | f
(9 rows)

由于hash函數沒有特定的排序規則,所以一般的hash索引只支持等值查詢,可以通過下面數據字典看到,所有操作都是“=”,而且hash索引也不會處理null值,所以不會標記null值,還有就是hash索引不存儲索引鍵,只存儲hash碼,所以不會 index-only掃描,也不支持多列創建hash索引

hank=# select  opf.opfname AS opfamily_name,
hank-#     amop.amopopr::regoperator AS opfamily_operator
hank-# from   pg_am am,
hank-#     pg_opfamily opf,
hank-#     pg_amop amop
hank-# where  opf.opfmethod = am.oid
hank-# and   amop.amopfamily = opf.oid
hank-# and   am.amname = 'hash'
hank-# order by opfamily_name,
hank-#     opfamily_operator;
  opfamily_name  |           opfamily_operator           
--------------------+------------------------------------------------------------
 abstime_ops    | =(abstime,abstime)
 aclitem_ops    | =(aclitem,aclitem)
 array_ops     | =(anyarray,anyarray)
 bool_ops      | =(boolean,boolean)
 bpchar_ops     | =(character,character)
 bpchar_pattern_ops | =(character,character)
 bytea_ops     | =(bytea,bytea)
 char_ops      | =("char","char")
 cid_ops      | =(cid,cid)
 date_ops      | =(date,date)
 enum_ops      | =(anyenum,anyenum)
 float_ops     | =(real,real)
 float_ops     | =(double precision,double precision)
 float_ops     | =(real,double precision)
 float_ops     | =(double precision,real)
 hash_hstore_ops  | =(hstore,hstore)
 integer_ops    | =(integer,bigint)
 integer_ops    | =(smallint,smallint)
 integer_ops    | =(integer,integer)
 integer_ops    | =(bigint,bigint)
 integer_ops    | =(bigint,integer)
 integer_ops    | =(smallint,integer)
 integer_ops    | =(integer,smallint)
 integer_ops    | =(smallint,bigint)
 integer_ops    | =(bigint,smallint)
 interval_ops    | =(interval,interval)
 jsonb_ops     | =(jsonb,jsonb)
 macaddr8_ops    | =(macaddr8,macaddr8)
 macaddr_ops    | =(macaddr,macaddr)
 name_ops      | =(name,name)
 network_ops    | =(inet,inet)
 numeric_ops    | =(numeric,numeric)
 oid_ops      | =(oid,oid)
 oidvector_ops   | =(oidvector,oidvector)
 pg_lsn_ops     | =(pg_lsn,pg_lsn)
 range_ops     | =(anyrange,anyrange)
 reltime_ops    | =(reltime,reltime)
 text_ops      | =(text,text)
 text_pattern_ops  | =(text,text)
 time_ops      | =(time without time zone,time without time zone)
 timestamp_ops   | =(timestamp without time zone,timestamp without time zone)
 timestamptz_ops  | =(timestamp with time zone,timestamp with time zone)
 timetz_ops     | =(time with time zone,time with time zone)
 uuid_ops      | =(uuid,uuid)
 xid_ops      | =(xid,xid)

從10版本開始,可以通過pageinspect插件查看hash索引的內部情況

安裝插件

create extension pageinspect;

查看0號page

hank=# select hash_page_type(get_raw_page('hank.idx_test_name',0));
 hash_page_type 
----------------
 metapage
(1 row)

查看索引中的行數和已用的最大存儲桶數

hank=# select ntuples, maxbucket
hank-# from hash_metapage_info(get_raw_page('hank.idx_test_name',0));  
 ntuples | maxbucket 
---------+-----------
  1000 |     3
(1 row)

可以看到1號page是bucket,查看此bucket page的活動元組和死元組的數量,

也就是膨脹度,以便維護索引

hank=# select hash_page_type(get_raw_page('hank.idx_test_name',1));
 hash_page_type 
----------------
 bucket
(1 row)
hank=# select live_items, dead_items
hank-# from hash_page_stats(get_raw_page('hank.idx_test_name',1));  
 live_items | dead_items 
------------+------------
    407 |     0
(1 row) 

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • PostgreSQL Sequence序列的使用詳解
  • PostgreSQL之INDEX 索引詳解
  • PostgreSql 重建索引的操作
  • Postgresql 查詢表引用或被引用的外鍵操作
  • PostgreSql 的hash_code函數的用法說明

標簽:寶雞 昭通 海西 杭州 溫州 濮陽 榆林 辛集

巨人網絡通訊聲明:本文標題《postgresql 索引之 hash的使用詳解》,本文關鍵詞  postgresql,索引,之,hash,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《postgresql 索引之 hash的使用詳解》相關的同類信息!
  • 本頁收集關于postgresql 索引之 hash的使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩中文字幕91| 在线免费av一区| 免费一级片91| 日本不卡一区二区三区高清视频| 亚洲一区二区精品3399| 性久久久久久久| 日本不卡123| 国产麻豆午夜三级精品| 国产成人在线视频免费播放| 大尺度一区二区| 色婷婷av一区二区三区之一色屋| 欧美在线不卡一区| 91麻豆精品国产91久久久久| 日韩一区二区免费视频| 久久久精品综合| 亚洲男人天堂av| 视频一区视频二区中文| 久久99精品国产.久久久久久| 韩日av一区二区| 91视频免费看| 91麻豆精品国产91久久久更新时间 | 日韩高清电影一区| 久草这里只有精品视频| fc2成人免费人成在线观看播放| 日本二三区不卡| 欧美电影免费提供在线观看| 国产欧美一区二区精品忘忧草| 国产精品久久久久一区二区三区共| 亚洲欧美日韩久久| 韩国av一区二区三区在线观看| 成人av网站在线观看免费| 欧美怡红院视频| 久久综合999| 亚洲国产综合视频在线观看| 国产一区二区成人久久免费影院 | 九一九一国产精品| 91小视频在线| 久久午夜色播影院免费高清| 亚洲亚洲人成综合网络| 成人激情综合网站| 日韩精品一区二区三区四区视频| 亚洲欧洲日产国码二区| 麻豆成人91精品二区三区| 色av综合在线| 国产精品美女久久久久久| 日日摸夜夜添夜夜添精品视频| 成人午夜伦理影院| 亚洲精品在线免费观看视频| 亚洲电影视频在线| 91看片淫黄大片一级在线观看| 久久伊人中文字幕| 日本一区中文字幕| 欧美美女黄视频| 依依成人综合视频| 色婷婷精品久久二区二区蜜臀av | 高清成人在线观看| 日韩免费高清视频| 免费在线观看视频一区| 欧美亚洲丝袜传媒另类| 亚洲婷婷国产精品电影人久久| 极品少妇一区二区三区精品视频| 欧美高清视频不卡网| 午夜视频久久久久久| 在线视频一区二区三| 亚洲精品老司机| 91黄色免费看| 性做久久久久久久免费看| 欧美中文字幕一二三区视频| 亚洲美女视频在线观看| 成人黄色片在线观看| 国产精品久久久久久妇女6080| 国产乱码字幕精品高清av| 亚洲精品在线观看网站| 国产成人免费在线观看| 国产欧美日韩中文久久| 成人自拍视频在线| 亚洲特级片在线| 欧美日韩在线观看一区二区| 亚洲成国产人片在线观看| 欧美日韩精品专区| 蜜桃在线一区二区三区| 精品成人a区在线观看| 国产一区在线视频| 国产精品蜜臀在线观看| 91视频国产资源| 亚洲国产一二三| 精品久久五月天| av在线播放成人| 五月天国产精品| 精品国产亚洲在线| www.视频一区| 五月开心婷婷久久| 久久久国产一区二区三区四区小说 | 色综合激情五月| 视频一区二区国产| 国产亚洲精品精华液| 91久久一区二区| 精品亚洲成a人在线观看| 亚洲天堂中文字幕| 日韩视频免费直播| 99久免费精品视频在线观看| 五月综合激情婷婷六月色窝| 久久久久国产一区二区三区四区| 99久久免费精品| 麻豆精品视频在线观看| 中文字幕av一区二区三区高| 欧美性一区二区| 国产高清成人在线| 亚洲成人av福利| 中文字幕五月欧美| 久久女同精品一区二区| 91九色最新地址| 国产精品69久久久久水密桃| 性做久久久久久久免费看| 久久精品一区四区| 欧美一二三四区在线| 波多野结衣精品在线| 极品少妇一区二区| 丝袜美腿高跟呻吟高潮一区| 国产精品视频在线看| 日韩一区二区在线观看视频| 99国产精品视频免费观看| 精品写真视频在线观看| 日本不卡视频在线观看| 亚洲成人中文在线| 国产精品成人一区二区艾草 | 欧美精品高清视频| caoporn国产一区二区| 国产乱子伦一区二区三区国色天香| 亚洲五码中文字幕| 亚洲精品精品亚洲| 国产精品乱码一区二区三区软件 | 精品久久一区二区| 欧美一区二区三区视频在线 | 欧美一级片在线| 欧美日韩免费电影| 欧美日韩精品一区二区| 色婷婷久久久亚洲一区二区三区| 成人国产精品免费观看视频| 国产麻豆精品theporn| 久久99热这里只有精品| 久久99精品国产麻豆婷婷| 日韩二区三区四区| 蜜臀av一区二区在线观看 | 亚洲视频 欧洲视频| 亚洲国产精品激情在线观看| 国产午夜亚洲精品羞羞网站| 久久久久久一二三区| 久久久久久久久久久黄色| 久久久久久毛片| 中文字幕第一页久久| 综合久久久久综合| 亚洲精品伦理在线| 亚洲福利电影网| 麻豆国产精品一区二区三区| 国产在线播精品第三| 高清不卡在线观看| 91小视频在线观看| 欧美日韩国产首页| 亚洲精品一区二区精华| 国产午夜精品久久久久久久| 国产精品每日更新| 亚洲国产精品久久艾草纯爱 | 一本到高清视频免费精品| 97se亚洲国产综合自在线不卡| 色欧美88888久久久久久影院| 欧美日韩亚洲丝袜制服| 26uuu亚洲综合色| **性色生活片久久毛片| 日韩中文字幕亚洲一区二区va在线| 加勒比av一区二区| 91影院在线免费观看| 欧美一区二区在线视频| 国产日韩成人精品| 亚洲一区二区三区在线看| 蜜臀av国产精品久久久久 | 三级不卡在线观看| 国产精品亚洲第一| 欧美无乱码久久久免费午夜一区 | 久久精品国产精品亚洲精品| 国产米奇在线777精品观看| 色综合久久综合网97色综合| 日韩欧美一二三四区| 国产精品成人在线观看| 日本系列欧美系列| 99国产精品99久久久久久| 日韩精品一区二区三区三区免费 | 日韩美女视频在线| 中文字幕在线一区| 国产综合色在线| 91精品国产欧美一区二区成人| 亚洲欧洲精品天堂一级| 精品一区二区三区在线视频| 欧美三级电影在线看| 中文在线一区二区| 久久99久久99精品免视看婷婷| 91福利视频在线| 亚洲欧洲色图综合| 国产a精品视频| 久久久久久久久久久久久久久99|