麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > PostgreSQL > 正文

介紹PostgreSQL中的jsonb數(shù)據(jù)類型

2020-10-29 21:49:50
字體:
供稿:網(wǎng)友

PostgreSQL 9.4 正在加載一項新功能叫jsonb,是一種新型資料,可以儲存支援GIN索引的JSON 資料。換言之,此功能,在即將來臨的更新中最重要的是,如果連這都不重要的話,那就把Postgres 置于文件為本數(shù)據(jù)庫系統(tǒng)的推薦位置吧。

自從9.2開始,一個整合JSON 資料類型已經(jīng)存在,帶有一整套功能(例如資料產(chǎn)生和資料解構(gòu)功能),還有9.3新增的操作者。當使用JSON 資料類型,資料的被存儲成一完全一樣的副本,功能還在此之上運作,還另外需要后臺運作的重新分析。

這心得JSONB 資料類型以已降解的2元格式存儲,所以,插入此資料會比JSON高效,因為后臺不再需要重新分析,因此讓它更快速運行,而且還兼顧GIN 索引。就是因為最后這個原因,我們實際上建議讀者使用jsonb來代替json制作程式(當然你還可以因應需要而使用json)。請記住jsonb使用相同的操作者和功能,讀者們可以看我之前的帖子去令你得到些什么啟發(fā)(或者干脆看Postgres的文件)。
 

現(xiàn)在讓我們看一下JSONB是如何工作的,同時和JSON比較一下。采用的測試數(shù)據(jù)是860萬的geobase類型數(shù)據(jù),大概1.1G大小,包括了城市名,國家代碼(可以在這參見完整列表)等很多字段。首先通過底層復制(raw copy)來把這些數(shù)據(jù)存儲到數(shù)據(jù)庫的一個新表里面,之后把這張表通過一組填充因子是100的表轉(zhuǎn)換成JSON/JSONB,之后來看它們各占多少空間。
 

=# COPY geodata FROM '$HOME/Downloads/allCountries.txt';COPY 8647839=# CREATE TABLE geodata_jsonb (data jsonb) with (fillfactor=100);CREATE TABLE=# CREATE TABLE geodata_json (data json) with (fillfactor=100);CREATE TABLE=# /timingTiming is on.=# INSERT INTO geodata_json SELECT row_to_json(geodata) FROM geodata;INSERT 0 8647839Time: 287158.457 ms=# INSERT INTO geodata_jsonb SELECT row_to_json(geodata)::jsonb FROM geodata;INSERT 0 8647839Time: 425825.967 ms

生成JSONB數(shù)據(jù)花費稍微長一點時間,大小有沒有區(qū)別呢?
 

=# SELECT pg_size_pretty(pg_relation_size('geodata_json'::regclass)) AS json,     pg_size_pretty(pg_relation_size('geodata_jsonb'::regclass)) AS jsonb; json  | jsonb ---------+--------- 3274 MB | 3816 MB(1 row)

在JSON數(shù)據(jù)上面做索引從9.3版本開始,比如用操作符(注意 因為它返回文本,所以'->>'被采用;并且根據(jù)查詢不同,索引采用不同的關(guān)鍵字)
 

=# CREATE INDEX geodata_index ON  geodata_json ((data->>'country_code'), (data->>'asciiname'));CREATE INDEX=# SELECT pg_size_pretty(pg_relation_size('geodata_index'::regclass))  AS json_index; json_index ------------ 310 MB(1 row)=# SELECT (data->>'population')::int as population,     data->'latitude' as latitude,     data->'longitude' as longitude  FROM geodata_json WHERE data->>'country_code' = 'JP' AND    data->>'asciiname' = 'Tokyo' AND    (data->>'population')::int != 0; population | latitude | longitude ------------+----------+-----------  8336599 | 35.6895 | 139.69171(1 row)=# -- Explain of previous query                            QUERY PLAN                            ------------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on geodata_json (cost=6.78..865.24 rows=215 width=32)  Recheck Cond: (((data ->> 'country_code'::text) = 'JP'::text) AND ((data ->> 'asciiname'::text) = 'Tokyo'::text))  Filter: (((data ->> 'population'::text))::integer <> 0)  -> Bitmap Index Scan on geodata_index (cost=0.00..6.72 rows=216 width=0)     Index Cond: (((data ->> 'country_code'::text) = 'JP'::text) AND ((data ->> 'asciiname'::text) = 'Tokyo'::text)) Planning time: 0.172 ms(6 rows)

在這個例子里,計劃(planner)可以使用bitmap索引掃描,同時使用了之前產(chǎn)生的索引。


現(xiàn)在,JSONB的一個新特點就是檢查包含帶有操作符@>的數(shù)據(jù)容量,這種數(shù)據(jù)是可以用GIN來索引的,這種操作符數(shù)據(jù)也包括了?,?|和?&(為了檢查給定的關(guān)鍵字是否存在)。 GIN索引對兩類操作符起作用:

    缺省操作符類,之前列出的四個;

    jsonb_hash_ops,僅支持@>,但是當搜索數(shù)據(jù)時性能表現(xiàn)不錯,而且所占磁盤空間較小;

下面是它如何工作:
 

=# CREATE INDEX geodata_gin ON geodata_jsonb   USING GIN (data jsonb_hash_ops);CREATE INDEX=# SELECT (data->>'population')::int as population,   data->'latitude' as latitude,   data->'longitude' as longitude  FROM geodata_jsonb WHERE data @> '{"country_code": "JP", "asciiname": "Tokyo"}' AND    (data->>'population')::int != 0; population | latitude | longitude ------------+----------+-----------  8336599 | 35.6895 | 139.69171(1 row) =# SELECT pg_size_pretty(pg_relation_size('geodata_gin'::regclass)) AS jsonb_gin; jsonb_gin----------- 1519 MB(1 row)=# -- EXPLAIN of previous query                   QUERY PLAN                   ------------------------------------------------------------------------------------- Bitmap Heap Scan on geodata_jsonb (cost=131.01..31317.76 rows=8605 width=418)  Recheck Cond: (data @> '{"asciiname": "Tokyo", "country_code": "JP"}'::jsonb)  Filter: (((data ->> 'population'::text))::integer <> 0)  -> Bitmap Index Scan on geodata_gin (cost=0.00..128.86 rows=8648 width=0)     Index Cond: (data @> '{"asciiname": "Tokyo", "country_code": "JP"}'::jsonb) Planning time: 0.134 ms

根據(jù)應用的需求,你或許想采用空間消耗低的索引,比如BTree建立在JSON數(shù)據(jù)上的索引類型;GIN索引有著更多的優(yōu)點,因為它覆蓋了所有的JSON字段,并且檢查容量;

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产污污视频 | 日本aaaa片毛片免费观蜜桃 | 久草高清视频 | 久久精品资源 | 羞羞视频在线免费 | av手机免费在线观看 | 久久久www免费看片 亚洲综合视频一区 | 91精品国产网站 | 91精品观看91久久久久久国产 | 钻石午夜影院 | 亚洲欧美国产高清va在线播放 | 香蕉久久久久久 | 亚洲免费毛片基地 | 国产日韩亚洲 | av免费在线观看国产 | 亚洲一区二区三区四区精品 | 欧美精品一区二区性色 | 在线2区 | 国产在线中文 | 热99在线视频 | 爱射av| 深夜福利久久久 | 91香蕉影视 | 伊人在线 | 福利在线小视频 | 中文字幕免费一区 | 成人在线免费视频播放 | 夜夜夜影院 | 国产精品久久久久久久久久大牛 | 久久精品视频网址 | 欧美精品久久久久久久久久 | 久久久www成人免费精品 | 久草视频国产在线 | 久久影院免费观看 | 国产一级aaa全黄毛片 | 日韩一级网站 | 欧美日韩一区三区 | 成人三级电影网址 | 精品亚洲一区二区 | 性aaa| 国产色爱综合网 |