PostgreSQL 13:索引并行vacuum
时间:2022-07-28
本文章向大家介绍PostgreSQL 13:索引并行vacuum,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原文
https://blog.dbi-services.com/postgresql-13-parallel-vacuum-for-indexes/
正文
PostgreSQL的MVCC机制的原因,需要清理old/dead记录。这写动作由vacuum完成。PostgreSQL12为止,vacuum还是一个表一个表,一个索引一个索引的进行。有一系列针对自动vacuum的参数对其进行调优。但是只有一个参数autovacuum_max_workers对表并行vacuum进行调优,对于索引并行vacuum仍不支持。PostgreSQL 13即将改变这种现状。
通过帮助信息可以看到vacuum新增了一个选项:
postgres=# h vacuum
Command: VACUUM
Description: garbage-collect and optionally analyze a database
Syntax:
VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
where option can be one of:
FULL [ boolean ]
FREEZE [ boolean ]
VERBOSE [ boolean ]
ANALYZE [ boolean ]
DISABLE_PAGE_SKIPPING [ boolean ]
SKIP_LOCKED [ boolean ]
INDEX_CLEANUP [ boolean ]
TRUNCATE [ boolean ]
PARALLEL integer
and table_and_columns is:
table_name [ ( column_name [, ...] ) ]
URL: https://www.postgresql.org/docs/devel/sql-vacuum.html
通过新增的“PARALLEL”选项,告诉vacuum使用多少后台进程针对给定表并行vacuum索引[0表示禁止并行处理]。下面是测试:
postgres=# create table t1 as select i as a, i::text as b, now() as c from generate_series(1,3000000) i;
SELECT 3000000
postgres=# create index i1 on t1(a);
CREATE INDEX
postgres=#
postgres=# create index i2 on t1(b);
CREATE INDEX
postgres=# create index i3 on t1(c);
CREATE INDEX
这表中有4个索引,如果指定4,则会有4个后台进程在这个表的索引上进行并行vacuum。
postgres=# update t1 set a=5,b='ccc',c=now() where mod(a,5)=0;
UPDATE 600000
postgres=# vacuum (parallel 4) t1;
VACUUM
由于这个表太小,只需要至少2个并行进程显示在vacuum的进程列表:
postgres 16688 15925 13 07:30 ? 00:01:07 postgres: postgres postgres [local] VACUUM
postgres 19184 15925 0 07:39 ? 00:00:00 postgres: parallel worker for PID 16688
postgres 19185 15925 0 07:39 ? 00:00:00 postgres: parallel worker for PID 16688
注意:并行vacuum的索引个数由min_parallel_index_scan_size控制。这个值最大为1024
postgres=# vacuum (parallel -4) t1;
ERROR: parallel vacuum degree must be between 0 and 1024
LINE 1: vacuum (parallel -4) t1;
下面是并行vacuum,并打印日志:
postgres=# vacuum (parallel 4, verbose true) t1;
INFO: vacuuming "public.t1"
INFO: launched 2 parallel vacuum workers for index vacuuming (planned: 2)
INFO: scanned index "i2" to remove 600000 row versions by parallel vacuum worker
DETAIL: CPU: user: 0.24 s, system: 0.06 s, elapsed: 0.89 s
INFO: scanned index "i1" to remove 600000 row versions
DETAIL: CPU: user: 0.17 s, system: 0.10 s, elapsed: 1.83 s
INFO: scanned index "i3" to remove 600000 row versions by parallel vacuum worker
DETAIL: CPU: user: 0.16 s, system: 0.14 s, elapsed: 1.69 s
INFO: scanned index "i4" to remove 600000 row versions by parallel vacuum worker
DETAIL: CPU: user: 0.25 s, system: 0.09 s, elapsed: 1.17 s
INFO: "t1": removed 600000 row versions in 20452 pages
DETAIL: CPU: user: 0.17 s, system: 0.16 s, elapsed: 1.43 s
INFO: index "i1" now contains 3000000 row versions in 14308 pages
DETAIL: 600000 index row versions were removed.
1852 index pages have been deleted, 640 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: index "i2" now contains 3000000 row versions in 14305 pages
DETAIL: 600000 index row versions were removed.
1851 index pages have been deleted, 640 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: index "i3" now contains 3000000 row versions in 14326 pages
DETAIL: 600000 index row versions were removed.
3941 index pages have been deleted, 1603 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: index "i4" now contains 3000000 row versions in 23391 pages
DETAIL: 600000 index row versions were removed.
5527 index pages have been deleted, 2246 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: "t1": found 600000 removable, 3000000 nonremovable row versions in 21835 out of 22072 pages
DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 499
There were 132 unused item identifiers.
Skipped 0 pages due to buffer pins, 237 frozen pages.
0 pages are entirely empty.
CPU: user: 0.75 s, system: 0.36 s, elapsed: 5.07 s.
INFO: vacuuming "pg_toast.pg_toast_16392"
INFO: index "pg_toast_16392_index" now contains 0 row versions in 1 pages
DETAIL: 0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: "pg_toast_16392": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 499
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM
- 【译】ASP.NET MVC 6路由技术
- 从原理到实践:Oracle 12.2 Sharding技术揭秘
- Xamarin-C#开发移动App-环境搭建
- Tensorflow快速入门
- .NET Core 实战笔记1-介绍和安装
- 全面直观认识深度神经网络
- dedecms清空所有文章怎么操作?sql语句如何写?
- .NET Core 实战笔记2-从命令开始
- 【译】使用Docker Compose一条指令配置Mesos
- 【译】Windows下的Docker Machine - 如何设置你的Docker主机
- 史上最透彻的KMP算法讲解
- 【译】助你成功搭建云应用的12条方法
- 你能用微信小程序打开小程序了【附开发方法】
- Logistic回归实战篇之预测病马死亡率(一)
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 程序员自我修养之 Git 提交信息和分支创建规范
- Django使用redis作为缓存系统
- 一天一大 leet(两个数组的交集 II)难度:简单-Day20200713
- 2020年研一末找实习总结(面经)
- 一天一大 leet(三角形最小路径和)难度:中等-Day20200714
- 一天一大 leet(判断二分图)难度:中等-Day20200716
- 一天一大 lee(被围绕的区域)难度:中等-Day20200811
- 一天一大 leet(搜索插入位置)难度:简单-Day20200717
- 一天一大 leet(两数之和 II - 输入有序数组)难度:简单-Day20200720
- 一天一大 leet(分割数组的最大值)难度:困难-Day20200725
- 一天一大 leet(矩阵中的最长递增路径)难度:困难-Day20200726
- 一天一大 lee(克隆图)难度:中等-Day20200812
- 一天一大 lee(有效的括号)难度:简单-Day20200814
- 一天一大 leet(判断子序列)难度:简单-Day20200727
- 一天一大 leet(寻宝)难度:困难-Day20200729