久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

PostgreSQL11有哪些新特性

共計(jì) 5918 個(gè)字符,預(yù)計(jì)需要花費(fèi) 15 分鐘才能閱讀完成。

這篇文章主要介紹“PostgreSQL11 有哪些新特性”,在日常操作中,相信很多人在 PostgreSQL11 有哪些新特性問(wèn)題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”P(pán)ostgreSQL11 有哪些新特性”的疑惑有所幫助!接下來(lái),請(qǐng)跟著丸趣 TV 小編一起來(lái)學(xué)習(xí)吧!

一、并行查詢

Parallel Hash
Hash Join 執(zhí)行時(shí),在構(gòu)造 Hash 表和進(jìn)行 Hash 連接時(shí),PG 11 可使用并行的方式執(zhí)行。
測(cè)試腳本:

testdb=# create table t1 (c1 int,c2 varchar(40),c3 varchar(40));
CREATE TABLE
testdb=# 
testdb=# insert into t1 select generate_series(1,5000000), TEST ||generate_series(1,1000000),generate_series(1,1000000)|| TEST 
INSERT 0 5000000
testdb=# drop table if exists t2;
DROP TABLE
testdb=# create table t2 (c1 int,c2 varchar(40),c3 varchar(40));
CREATE TABLE
testdb=# 
testdb=# insert into t2 select generate_series(1,1000000), T2 ||generate_series(1,1000000),generate_series(1,1000000)|| T2 
INSERT 0 1000000
testdb=# explain verbose
testdb-# select t1.c1,t2.c1 
testdb-# from t1 inner join t2 on t1.c1 = t2.c1;
 QUERY PLAN 
---------------------------------------------------------------------------------------------
 Gather (cost=18372.00..107975.86 rows=101100 width=8)
 Output: t1.c1, t2.c1
 Workers Planned: 2 -- 2 Workers
 -  Parallel Hash Join (cost=17372.00..96865.86 rows=42125 width=8) -- Parallel Hash Join
 Output: t1.c1, t2.c1
 Hash Cond: (t1.c1 = t2.c1)
 -  Parallel Seq Scan on public.t1 (cost=0.00..45787.33 rows=2083333 width=4)
 Output: t1.c1
 -  Parallel Hash (cost=10535.67..10535.67 rows=416667 width=4) -- Parallel Hash
 Output: t2.c1
 -  Parallel Seq Scan on public.t2 (cost=0.00..10535.67 rows=416667 width=4)
 Output: t2.c1

除了 Parallel Hash 外,PG 11 在執(zhí)行 Parallel Append(執(zhí)行 UNION ALL 等集合操作)/CREATE TABLE AS SELECT/CREATE MATERIALIZED VIEW/SELECT INTO/CREATE INDEX 等操作時(shí)以并行的方式執(zhí)行.

二、數(shù)據(jù)表分區(qū)

Hash Partition
PG 在 11.x 引入了 Hash 分區(qū), 關(guān)于 Hash 分區(qū), 官方文檔有如下說(shuō)明:

The table is partitioned by specifying a modulus and a remainder for each partition. Each partition will hold the rows for which the hash value of the partition key divided by the specified modulus will produce the specified remainder.

每個(gè) Hash 分區(qū)需指定 模 (modulus)和 余 (remainder), 數(shù)據(jù)在哪個(gè)分區(qū) (partition index) 的計(jì)算公式:
partition index = abs(hashfunc(key)) % modulus

drop table if exists t_hash2;
create table t_hash2 (c1 int,c2 varchar(40),c3 varchar(40)) partition by hash(c1);
create table t_hash2_1 partition of t_hash2 for values with (modulus 6,remainder 0);
create table t_hash2_2 partition of t_hash2 for values with (modulus 6,remainder 1);
create table t_hash2_3 partition of t_hash2 for values with (modulus 6,remainder 2);
create table t_hash2_4 partition of t_hash2 for values with (modulus 6,remainder 3);
create table t_hash2_5 partition of t_hash2 for values with (modulus 6,remainder 4);
create table t_hash2_6 partition of t_hash2 for values with (modulus 6,remainder 5);
testdb=# insert into t_hash2 
testdb-# select generate_series(1,1000000), HASH ||generate_series(1,1000000),generate_series(1,1000000)|| HASH 
INSERT 0 1000000

數(shù)據(jù)在各分區(qū)上的分布大體均勻.
2018-9-19 注: 由于插入數(shù)據(jù)時(shí)語(yǔ)句出錯(cuò), 昨天得出的結(jié)果有誤(但數(shù)據(jù)在各個(gè)分區(qū)的分布上不太均勻,t_hash2_1 分區(qū)行數(shù)明顯的比其他分區(qū)的要多很多), 請(qǐng)忽略

testdb=# select count(*) from only t_hash2;
; count 
-------
 0
(1 row)
testdb=# select count(*) from only t_hash2_1;
 count 
--------
 166480
(1 row)
testdb=# select count(*) from only t_hash2_2;
 count 
--------
 166904
(1 row)
testdb=# select count(*) from only t_hash2_3;
 count 
--------
 166302
(1 row)
testdb=# select count(*) from only t_hash2_4;
 count 
--------
 166783
(1 row)
testdb=# select count(*) from only t_hash2_5;
 count 
--------
 166593
(1 row)
testdb=# select count(*) from only t_hash2_6;
 count 
--------
 166938
(1 row)

Hash 分區(qū)鍵亦可以創(chuàng)建在字符型字段上

testdb=# drop table if exists t_hash4;
DROP TABLE
testdb=# create table t_hash4 (c1 int,c2 varchar(40),c3 varchar(40)) partition by hash(c2);
CREATE TABLE
--  需創(chuàng)建相應(yīng)的 Partition 用于存儲(chǔ)相應(yīng)的數(shù)據(jù)
testdb=# insert into t_hash4 
testdb-# select generate_series(1,100000), HASH ||generate_series(1,1000000),generate_series(1,1000000)|| HASH 
ERROR: no partition of relation  t_hash4  found for row
DETAIL: Partition key of the failing row contains (c2) = (HASH1).
-- 6 個(gè)分區(qū),3 個(gè) sub-table, 插入數(shù)據(jù)會(huì)出錯(cuò)
testdb=# 
testdb=# create table t_hash4_1 partition of t_hash4 for values with (modulus 6,remainder 0);
CREATE TABLE
testdb=# create table t_hash4_2 partition of t_hash4 for values with (modulus 6,remainder 1);
CREATE TABLE
testdb=# create table t_hash4_3 partition of t_hash4 for values with (modulus 6,remainder 2);
CREATE TABLE
testdb=# insert into t_hash4 
testdb-# select generate_series(1,10000), HASH ||generate_series(1,10000),generate_series(1,10000)|| HASH 
ERROR: no partition of relation  t_hash4  found for row
DETAIL: Partition key of the failing row contains (c2) = (HASH1).
-- 3 個(gè)分區(qū),3 個(gè) sub-table, 正常
testdb=# drop table if exists t_hash4;
DROP TABLE
testdb=# create table t_hash4 (c1 int,c2 varchar(40),c3 varchar(40)) partition by hash(c2);
CREATE TABLE
testdb=# create table t_hash4_1 partition of t_hash4 for values with (modulus 3,remainder 0);
CREATE TABLE
testdb=# create table t_hash4_2 partition of t_hash4 for values with (modulus 3,remainder 1);
CREATE TABLE
testdb=# create table t_hash4_3 partition of t_hash4 for values with (modulus 3,remainder 2);
CREATE TABLE
testdb=# insert into t_hash4 
testdb-# select generate_series(1,10000), HASH ||generate_series(1,10000),generate_series(1,10000)|| HASH 
INSERT 0 10000

考察分區(qū)的數(shù)據(jù)分布, 還比較均勻:

testdb=# 
testdb=# select count(*) from only t_hash4;
 count 
-------
 0
(1 row)
testdb=# select count(*) from only t_hash4_1;
 count 
-------
 3378
(1 row)
testdb=# select count(*) from only t_hash4_2;
 count 
-------
 3288
(1 row)
testdb=# select count(*) from only t_hash4_3;
 count 
-------
 3334
(1 row)

Default Partition
List 和 Range 分區(qū)可指定 Default Partition(Hash 分區(qū)不支持).

Update partition key
PG 11 可 Update 分區(qū)鍵, 這會(huì)導(dǎo)致數(shù)據(jù)的 遷移 .

Create unique constraint
PG 11 在分區(qū)表上創(chuàng)建主鍵和唯一索引 (注:Oracle 在很早的版本已支持此特性).
在普通字段上可以創(chuàng)建 BTree 索引.

testdb=# alter table t_hash2 add primary key(c1);
ALTER TABLE
testdb=# create index idx_t_hash2_c2 on t_hash2(c2);
CREATE INDEX

FOREIGN KEY support
PG 11 支持在分區(qū)上創(chuàng)建外鍵.

除了上述幾個(gè)新特性外, 分區(qū)上面,PG 11 在 Automatic index creation/INSERT ON CONFLICT/Partition-Wise Join / Partition-Wise Aggregate/FOR EACH ROW trigger/Dynamic Partition Elimination/Control Partition Pruning 上均有所增強(qiáng).

到此,關(guān)于“PostgreSQL11 有哪些新特性”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-20發(fā)表,共計(jì)5918字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 二连浩特市| 德阳市| 宣威市| 萨迦县| 潞西市| 延庆县| 克拉玛依市| 鄂尔多斯市| 邹平县| 法库县| 东源县| 涟水县| 灵寿县| 安远县| 西吉县| 辽阳市| 嵩明县| 巴楚县| 来安县| 得荣县| 嘉定区| 武穴市| 许昌市| 旺苍县| 琼海市| 镇康县| 淳化县| 岑巩县| 东莞市| 东丰县| 时尚| 台东县| 广河县| 天津市| 墨脱县| 阜阳市| 喀什市| 漳州市| 乌恰县| 左权县| 封开县|