分区的概念是把大型表逻辑分解为小块的更好的性能数据库。
内置的PostgreSQL分区技术的方法
- 范围分区
- 表分区
- 散列分区
何时使用分区
- 批量数据加载和删除操作可以执行使用附加的分区特征和有效分离。
- 确切的点表将受益于分区取决于应用程序。然而,经验法则是,表的大小应该超过数据库服务器的物理内存。
- 数据增长,可以创建子分区,这提高了性能,也可以删除旧的分区通过使他们独立的或完全放弃他们。
分区的好处
- 可以提高查询性能DDL和DML操作在某些情况下,特别是当最严重的被访问的行表的单个分区或少量的分区如下解释。
- 当查询或更新访问一个大比例的一个分区,可以提高性能通过使用顺序扫描的分区,而不是使用一个索引,这将要求随机访问读取分散在整个表。
- 将分区表或删除分区表可以通过使用DROP table和截断表,分别通过删除操作减少负载。
范围分区
数据库分区是基于一个特定范围的列与数据日期和数值。
在这里,作为一个例子,我创建了一个表范围分区和分区表为每个季度日期列。
|
1
2
|
创建
表
员工
(
id
INT
不
零
,
帧
VARCHAR
(
20.
)
,
lname
VARCHAR
(
20.
)
,
强加于人
日期
不
零
,
加入
日期
不
零
)
分区
通过
范围
(
加入
)
;
|
|
1
2
3
4
|
创建
表
employees_q1
分区
的
员工
为
值
从
(
“2022-01-01”
)
来
(
“2022-04-01”
)
;
创建
表
employees_q2
分区
的
员工
为
值
从
(
“2022-04-01”
)
来
(
“2022-07-01”
)
;
创建
表
employees_q3
分区
的
员工
为
值
从
(
“2022-07-01”
)
来
(
“2022-10-01”
)
;
创建
表
employees_q4
分区
的
员工
为
值
从
(
“2022-10-01”
)
来
(
“2023-01-01”
)
;
|
范围分区表中所示的结构。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
d
+
员工
分区
表
“public.employees”
列
|
类型
|
排序
|
可以为空
|
默认的
|
存储
|
压缩
|
统计数据
目标
|
描述
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
id
|
整数
|
|
不
零
|
|
平原
|
|
|
帧
|
字符
不同
(
20.
)
|
|
|
|
扩展
|
|
|
lname
|
字符
不同
(
20.
)
|
|
|
|
扩展
|
|
|
强加于人
|
日期
|
|
不
零
|
|
平原
|
|
|
加入
|
日期
|
|
不
零
|
|
平原
|
|
|
分区
关键
:
范围
(
加入
)
分区
:
employees_q1
为
值
从
(
“2022-01-01”
)
来
(
“2022-04-01”
)
,
employees_q2
为
值
从
(
“2022-04-01”
)
来
(
“2022-07-01”
)
,
employees_q3
为
值
从
(
“2022-07-01”
)
来
(
“2022-10-01”
)
,
employees_q4
为
值
从
(
“2022-10-01”
)
来
(
“2023-01-01”
)
|
插入一些随机的数据条目,一年365天。
|
1
2
3
|
插入
成
员工
(
id
,
帧
,
lname
,
强加于人
,
加入
)
值
(
generate_series
(
1
,
365年
)
,
(
数组
(
奥斯瓦尔德的
,
“亨利。”
,
“鲍勃”
,
“Vennie”
]
)
(
地板上
(
随机
(
)
*
4
+
1
)
]
,
(
数组
(
“狮子座”
,
“杰克”
,
“窝”
,
“黛西”
,
“木质”
]
)
(
地板上
(
随机
(
)
*
5
+
1
)
]
,
“1995-01-01”
::
日期
+
trunc
(
随机
(
)
*
366年
*
3
)
::
int
,
generate_series
(
“1/1/2022”
::
日期
,
“12/31/2022”
::
日期
,
“一天”
)
)
;
|
范围分区数据被视为低于分布在其分区。
|
1
2
3
4
5
6
7
8
9
10
|
选择
员工
_第一季度
,
员工
_第二季
,
员工
_第三季
,
员工
_第四季度
,
employees_totalcnt
从
(
选择
数
(
*
)
从
员工
_第一季度
)
作为
employees_q1
,
(
选择
数
(
*
)
从
员工
_第二季
)
作为
employees_q2
,
(
选择
数
(
*
)
从
员工
_第三季
)
作为
employees_q3
,
(
选择
数
(
*
)
从
员工
_第三季
)
作为
员工
_第四季度
,
(
选择
数
(
*
)
从
员工
)
作为
员工
_totalcnt
;
employees_q1
|
employees_q2
|
employees_q3
|
employees_q4
|
employees_totalcnt
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
(
90年
)
|
(
91年
)
|
(
92年
)
|
(
92年
)
|
(
365年
)
(
1
行
)
|
DDL操作的性能
这里,我创建了一个表没有一个分区和插入相同的数据,类似于分区表。
查询计划被认为更适合当执行DDL操作数据与单个分区或更少的分区。
|
1
|
创建
表
employees_nopartition
(
id
INT
不
零
,
帧
VARCHAR
(
20.
)
,
lname
VARCHAR
(
20.
)
,
强加于人
日期
不
零
,
加入
日期
不
零
)
;
|
|
1
2
3
|
插入
成
employees_nopartition
(
id
,
帧
,
lname
,
强加于人
,
加入
)
值
(
generate_series
(
1
,
365年
)
,
(
数组
(
奥斯瓦尔德的
,
“亨利。”
,
“鲍勃”
,
“Vennie”
]
)
(
地板上
(
随机
(
)
*
4
+
1
)
]
,
(
数组
(
“狮子座”
,
“杰克”
,
“窝”
,
“黛西”
,
“木质”
]
)
(
地板上
(
随机
(
)
*
5
+
1
)
]
,
“1995-01-01”
::
日期
+
trunc
(
随机
(
)
*
366年
*
3
)
::
int
,
generate_series
(
“1/1/2022”
::
日期
,
“12/31/2022”
::
日期
,
“一天”
)
)
;
|
|
1
2
3
4
5
6
|
解释
select *
从
employees_nopartition
在哪里
加入
&
gt
;
=
“2022-05-12”
和
加入
&
lt
;
“2022-06-10”
;
查询
计划
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
Seq
扫描
在
employees_nopartition
(
成本
=
0.00,8.47
行
=
29日
宽度
=
22
)
过滤器
:
(
(
加入
&
gt
;
=
“2022-05-12”
::
日期
)
和
(
加入
&
lt
;
“2022-06-10”
::
日期
)
)
(
2
行
)
|
在这里,我们可以看到一个更好的查询计划时数据都是从比数据获取的非分区表的分区表。
|
1
2
3
4
5
6
|
解释
select *
从
员工
在哪里
加入
&
gt
;
=
“2022-05-12”
和
加入
&
lt
;
“2022-06-10”
;
查询
计划
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
Seq
扫描
在
employees_q2
(
成本
=
0.00,2.37
行
=
29日
宽度
=
22
)
过滤器
:
(
(
加入
&
gt
;
=
“2022-05-12”
::
日期
)
和
(
加入
&
lt
;
“2022-06-10”
::
日期
)
)
(
2
行
)
|
表分区
数据库分区基于键值(s)或离散值和分区也可以用列的表达式(表达式)列表(范围),这是解释如下:
例如,我创建了一个表分区列表和一些list-partitioned表,并插入一些随机数据与1000行。
|
1
|
创建
表
销售
(
id
INT
不
零
,
分支
VARCHAR
(
3
)
,
类型
文本
,
量
int
)
分区
通过
列表
(
分支
)
;
|
|
1
2
3
4
|
创建
表
HYD_sales
分区
的
销售
为
值
在
(
海德拉巴的
)
;
创建
表
BLR_sales
分区
的
销售
为
值
在
(
“BLR”
)
;
创建
表
DEL_sales
分区
的
销售
为
值
在
(
“▽”
)
;
创建
表
TPT_sales
分区
的
销售
为
值
在
(
“课程”
)
;
|
|
1
2
|
插入
成
销售
(
id
,
分支
,
类型
,
量
)
值
(
generate_series
(
1
,
1000年
)
,
(
数组
(
海德拉巴的
,
“BLR”
,
“▽”
,
“课程”
]
)
(
地板上
(
随机
(
)
*
4
+
1
)
]
,
(
数组
(
“笔记本电脑”
,
“打印机”
,
“Hardisks”
,
“桌面”
,
“raybet雷竞技竞猜在线官网监控”
]
)
(
地板上
(
随机
(
)
*
5
+
1
)
]
,
(
随机
(
)
*
200000年
)
::
int
)
;
|
列表分区的表定义如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
d
+
销售
分区
表
“public.sales”
列
|
类型
|
排序
|
可以为空
|
默认的
|
存储
|
统计数据
目标
|
描述
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
id
|
整数
|
|
不
零
|
|
平原
|
|
分支
|
字符
不同
(
3
)
|
|
|
|
扩展
|
|
类型
|
文本
|
|
|
|
扩展
|
|
量
|
整数
|
|
|
|
平原
|
|
分区
关键
:
列表
(
分支
)
分区
:
blr_sales
为
值
在
(
“BLR”
)
,
del_sales
为
值
在
(
“▽”
)
,
hyd_sales
为
值
在
(
海德拉巴的
)
,
tpt_sales
为
值
在
(
“课程”
)
|
分区数据分布在其分区如下所示:
|
1
2
3
4
5
6
7
8
|
选择
blr
_销售
,
▽
_销售
,
hyd_sales
,
tpt_sales
,
total_cnt
从
(
选择
数
(
*
)
从
blr
_销售
)
作为
blr_sales
,
(
选择
数
(
*
)
从
▽
_销售
)
作为
del_sales
,
(
选择
数
(
*
)
从
海德拉巴
_销售
)
作为
hyd_sales
,
(
选择
数
(
*
)
从
课程的
_销售
)
作为
课程的
_销售
,
(
选择
数
(
*
)
从
销售
)
作为
total_cnt
;
blr_sales
|
del_sales
|
hyd_sales
|
tpt_sales
|
total_cnt
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
(
262年
)
|
(
258年
)
|
(
228年
)
|
(
252年
)
|
(
1001年
)
(
1
行
)
|
使用表达式列表分区
例如,我创建了一个表列表分区使用的表达式列。
|
1
2
|
创建
表
捐助者
(
id
INT
不
零
,
的名字
VARCHAR
(
20.
)
,
bloodgroup
VARCHAR
(
15
)
,
last_donated
日期
,
contact_num
VARCHAR
(
10
)
)
分区
通过
列表
(
左
(
上
(
bloodgroup
)
,
3
)
)
;
|
|
1
2
3
4
5
6
7
8
|
创建
表
A_positive
分区
的
捐助者
为
值
在
(
“+”
)
;
创建
表
A_negative
分区
的
捐助者
为
值
在
(
“- - -”
)
;
创建
表
B_positive
分区
的
捐助者
为
值
在
(
“B +”
)
;
创建
表
B_negative
分区
的
捐助者
为
值
在
(
“B -”
)
;
创建
表
AB_positive
分区
的
捐助者
为
值
在
(
“AB +”
)
;
创建
表
AB_negative
分区
的
捐助者
为
值
在
(
“AB - - - - - -”
)
;
创建
表
O_positive
分区
的
捐助者
为
值
在
(
“O +”
)
;
创建
表
O_negative
分区
的
捐助者
为
值
在
(
“啊——”
)
;
|
列表分区的表定义如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
d
+
捐助者
分区
表
“public.donors”
列
|
类型
|
排序
|
可以为空
|
默认的
|
存储
|
压缩
|
统计数据
目标
|
描述
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
id
|
整数
|
|
不
零
|
|
平原
|
|
|
的名字
|
字符
不同
(
20.
)
|
|
|
|
扩展
|
|
|
bloodgroup
|
字符
不同
(
15
)
|
|
|
|
扩展
|
|
|
last_donated
|
日期
|
|
|
|
平原
|
|
|
contact_num
|
字符
不同
(
10
)
|
|
|
|
扩展
|
|
|
分区
关键
:
列表
(
“左”
(
上
(
(
bloodgroup
)
::
文本
)
,
3
)
)
分区
:
a_negative
为
值
在
(
“- - -”
)
,
a_positive
为
值
在
(
“+”
)
,
ab_negative
为
值
在
(
“AB - - - - - -”
)
,
ab_positive
为
值
在
(
“AB +”
)
,
b_negative
为
值
在
(
“B -”
)
,
b_positive
为
值
在
(
“B +”
)
,
o_negative
为
值
在
(
“啊——”
)
,
o_positive
为
值
在
(
“O +”
)
|
在这里,我一些随机插入100行。
|
1
2
3
|
插入
成
捐助者
(
id
,
的名字
,
bloodgroup
,
去年
_捐赠
,
contact_num
)
值
(
generate_series
(
1
,
One hundred.
)
,
“user_”
| |
trunc
(
随机
(
)
*
One hundred.
)
,
(
数组
(
“一群+”
,
——组织的
,
“啊——集团”
,
“O +集团”
,
“AB +集团”
,
“AB集团”
,
“B +集团”
,
“B -集团”
]
)
(
地板上
(
随机
(
)
*
8
+
1
)
]
,
“2022-01-01”
::
日期
+
trunc
(
随机
(
)
*
366年
*
1
)
::
int
,
投
(
1000000000
+
地板上
(
随机
(
)
*
9000000000
)
作为
长整型数字
)
)
;
|
与表达分布在它的分区是分区数据列表所示:
|
1
2
3
4
5
6
7
8
9
10
|
选择
一个
_负
,
一个
_积极的
,
ab
_负
,
ab
_积极的
,
b
_负
,
b
_积极的
,
o
_负
,
o
_积极的
,
total_cnt
从
(
选择
数
(
*
)
从
一个
_负
)
作为
a_negative
,
(
选择
数
(
*
)
从
一个
_积极的
)
作为
a_positive
,
(
选择
数
(
*
)
从
ab
_负
)
作为
ab_negative
,
(
选择
数
(
*
)
从
ab
_积极的
)
作为
ab
_积极的
,
(
选择
数
(
*
)
从
b
_负
)
作为
b_negative
,
(
选择
数
(
*
)
从
b
_积极的
)
作为
b
_积极的
,
(
选择
数
(
*
)
从
o
_积极的
)
作为
o
_积极的
,
(
选择
数
(
*
)
从
o
_负
)
作为
o_negative
,
(
选择
数
(
*
)
从
捐助者
)
作为
total_cnt
;
a_negative
|
a_positive
|
ab_negative
|
ab_positive
|
b_negative
|
b_positive
|
o_negative
|
o_positive
|
total_cnt
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
(
9
)
|
(
19
)
|
(
10
)
|
(
12
)
|
(
12
)
|
(
10
)
|
(
18
)
|
(
10
)
|
(
One hundred.
)
(
1
行
)
|
DML操作的性能
这里有一个例子所示的表,没有创建分区和插入相同的数据类似的分区表。
下面我创建了一个表没有分区并与1000行显示插入一些随机数据查询性能。
|
1
|
创建
表
sales_nopartition
(
id
INT
不
零
,
分支
VARCHAR
(
3
)
,
类型
文本
,
量
int
)
;
|
|
1
2
3
|
插入
成
sales_nopartition
(
id
,
分支
,
类型
,
量
)
值
(
generate_series
(
1
,
1000年
)
,
(
数组
(
海德拉巴的
,
“BLR”
,
“▽”
,
“课程”
]
)
(
地板上
(
随机
(
)
*
4
+
1
)
]
,
(
数组
(
“笔记本电脑”
,
“打印机”
,
“Hardisks”
,
“桌面”
,
“raybet雷竞技竞猜在线官网监控”
]
)
(
地板上
(
随机
(
)
*
5
+
1
)
]
,
(
随机
(
)
*
200000年
)
::
int
)
;
|
更新查询性能
|
1
2
3
4
5
6
7
|
解释
更新
sales_nopartition
集
类型
=
“智能手表”
在哪里
分支
=
海德拉巴的
;
查询
计划
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
更新
在
sales_nopartition
(
成本
=
0.00,19.50
行
=
229年
宽度
=
50
)
- - - - - -
&
gt
;
Seq
扫描
在
sales_nopartition
(
成本
=
0.00,19.50
行
=
229年
宽度
=
50
)
过滤器
:
(
(
分支
)
::
文本
=
海德拉巴的
::
文本
)
(
3
行
)
|
|
1
2
3
4
5
6
7
8
|
解释
更新
销售
集
类型
=
“智能手表”
在哪里
分支
=
海德拉巴的
;
查询
计划
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
更新
在
销售
(
成本
=
0.00,5.10
行
=
248年
宽度
=
50
)
更新
在
hyd_sales
- - - - - -
&
gt
;
Seq
扫描
在
hyd_sales
(
成本
=
0.00,5.10
行
=
248年
宽度
=
50
)
过滤器
:
(
(
分支
)
::
文本
=
海德拉巴的
::
文本
)
(
4
行
)
|
删除查询性能
|
1
2
3
4
5
6
7
|
解释
删除
从
sales_nopartition
在哪里
分支
=
海德拉巴的
;
查询
计划
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
删除
在
sales_nopartition
(
成本
=
0.00,19.50
行
=
229年
宽度
=
6
)
- - - - - -
&
gt
;
Seq
扫描
在
sales_nopartition
(
成本
=
0.00,19.50
行
=
229年
宽度
=
6
)
过滤器
:
(
(
分支
)
::
文本
=
海德拉巴的
::
文本
)
(
3
行
)
|
|
1
2
3
4
5
6
7
8
|
解释
删除
从
销售
在哪里
分支
=
海德拉巴的
;
查询
计划
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
删除
在
销售
(
成本
=
0.00,5.10
行
=
248年
宽度
=
6
)
删除
在
hyd_sales
- - - - - -
&
gt
;
Seq
扫描
在
hyd_sales
(
成本
=
0.00,5.10
行
=
248年
宽度
=
6
)
过滤器
:
(
(
分支
)
::
文本
=
海德拉巴的
::
文本
)
(
4
行
)
|
上面的示例显示删除和更新操作的性能与数据获取从单个分区表有更好的查询计划比没有分区。
散列分区
散列分区表被定义为表分区通过指定模量和每个分区的剩余部分。
- 每个分区将持有的散列值的行指定的分区键除以模量将产生指定的剩余部分。
- 散列分区时最好使用每个分区是在不同的表空间驻留在单独的物理磁盘,所以IO同样除以更多的设备。
例如,我创建了一个表与散列分区和分区表5模量。
|
1
|
创建
表
学生
(
id
int
不
零
,
的名字
varchar
(
30.
)
不
零
,
课程
varchar
(
One hundred.
)
,
加入
日期
)
分区
通过
哈希
(
id
)
;
|
|
1
2
3
4
5
|
创建
表
student_0
分区
的
学生
为
值
与
(
模量
5
,
剩余部分
0
)
;
创建
表
student_1
分区
的
学生
为
值
与
(
模量
5
,
剩余部分
1
)
;
创建
表
student_2
分区
的
学生
为
值
与
(
模量
5
,
剩余部分
2
)
;
创建
表
student_3
分区
的
学生
为
值
与
(
模量
5
,
剩余部分
3
)
;
创建
表
student_4
分区
的
学生
为
值
与
(
模量
5
,
剩余部分
4
)
;
|
下面的表结构看起来像一个有五个创建分区:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
d
+
学生
分区
表
“public.students”
列
|
类型
|
排序
|
可以为空
|
默认的
|
存储
|
统计数据
目标
|
描述
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
id
|
整数
|
|
不
零
|
|
平原
|
|
的名字
|
字符
不同
(
30.
)
|
|
不
零
|
|
扩展
|
|
课程
|
字符
不同
(
One hundred.
)
|
|
|
|
扩展
|
|
加入
|
日期
|
|
|
|
平原
|
|
分区
关键
:
哈希
(
id
)
分区
:
student_0
为
值
与
(
模量
5
,
剩余部分
0
)
,
student_1
为
值
与
(
模量
5
,
剩余部分
1
)
,
student_2
为
值
与
(
模量
5
,
剩余部分
2
)
,
student_3
为
值
与
(
模量
5
,
剩余部分
3
)
,
student_4
为
值
与
(
模量
5
,
剩余部分
4
)
|
在这里,我与100000行插入一些随机数据。
|
1
2
|
插入
成
学生
(
id
,
的名字
,
课程
,
加入
)
值
(
generate_series
(
1
,
100000年
)
,
“student_”
| |
trunc
(
随机
(
)
*
1000年
)
,
(
数组
(
“金融,账户的
,
业务统计的
,
“环境科学”
]
)
(
地板上
(
随机
(
)
*
3
+
1
)
]
,
“2019-01-01”
::
日期
+
trunc
(
随机
(
)
*
366年
*
3
)
::
int
)
;
|
我们看到下面的散列分区数据分区表。
|
1
2
3
4
5
6
7
8
9
|
选择
relname
,
reltuples
作为
行
从
pg_class
在哪里
relname
在
(
“student_0”
,
“student_1”
,
“student_2”
,
“student_3”
,
“student_4”
)
订单
通过
relname
;
relname
|
行
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - - - - -
student_0
|
19851年
student_1
|
20223年
student_2
|
19969年
student_3
|
19952年
student_4
|
20005年
(
5
行
)
|
散列分区的好处
- 的主要好处是确保数据均匀分布在一个预先确定的数量的分区。
- 使用散列键有效且高效地在范围不适用的情况下,员工编号,产品编号,等。
如果是范围或列表的数据吗?
为此,我们使用默认分区范围和分区表列表。
范围和列表分区,数据可以存储暂时超出范围,通过创建一个默认分区之后创建一个适当的分区。
哈希分区的表可能没有一个默认的分区,作为散列分区创建一个默认的分区没有任何意义,不需要。
我们看到当我试着插入数据的分区不存在,在这种情况下默认分区如何帮助。
|
1
2
3
|
插入
成
销售
值
(
1001年
,
“岬”
,
“扫描仪”
,
190000年
)
;
错误
:
没有
分区
的
关系
“销售”
发现
为
行
细节
:
分区
关键
的
的
失败
行
包含
(
分支
)
=
(
岬
)
。
|
|
1
2
3
4
5
|
创建
表
sales_default
分区
的
销售
默认的
;
创建
表
插入
成
销售
值
(
1001年
,
“岬”
,
“扫描仪”
,
190000年
)
;
插入
0
1
|
|
1
2
3
4
5
|
select *
从
销售
_默认的
;
id
|
分支
|
类型
|
量
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
1001年
|
岬
|
扫描仪
|
190000年
(
1
行
)
|
所以我们插入的数据发送到默认的分区,分区可以创建后基于默认表中的数据和可用分区。
结论
这里我们讨论了默认分区技术在PostgreSQL使用单一的列,我们还可以创建多列分区。PostgreSQL分区管理器(pg_partman)也可以用于创建和管理有效的分区。进一步的细节将会在即将到来的博客解释道。
另外,请查收以下相关博客供参考:
雷竞技下载官网Percona分布PostgreSQL提供最好的和最关键的企业组件从开源社区在一个分布,设计和测试一起工作。





