允许将未记录的表更改为记录的表 GSoC 2014
介绍
该项目将允许更改未记录的表(不生成事务日志)及其依赖项为记录的表,换句话说,一个在 WAL 文件中记录更改的常规表,以及从记录的表更改为未记录的表。为了实现这一点,我们将引入以下 SQL 语法
ALTER TABLE name SET LOGGED; ALTER TABLE name SET UNLOGGED;
对 PostgreSQL 社区的益处
未记录的表功能是在 9.1 版本中引入的,与常规表(记录的表)相比,它提供了更好的写入性能,但不是崩溃安全的。如果服务器崩溃,它们的内容将自动丢弃(清除)。此外,它们的内容不会传播到备用服务器。
将未记录的表转换为记录的表将允许我们拥有两全其美;我们可以将大量数据(ETL 脚本)加载到未记录的表中以获得更好的性能,然后将其更改为记录的表以提供持久性。
附加目标
该项目的主要目标是允许将表从未记录的表更改为记录的表,以及从记录的表更改为未记录的表,但根据社区的建议,我们将扩展此提议以实现更多相关目标。
- 允许在记录的表上使用未记录的索引
- ALTER INDEX name SET { UNLOGGED | LOGGED }
- 在 wal_level = minimal 时,实现“ALTER TABLE name SET LOGGED”而不重写整个表。
- 允许未记录的物化视图
- ALTER MATERIALIZED VIEW name SET { UNLOGGED | LOGGED }
交付成果
该项目到最后只有一个交付成果。交付成果将是实现将未记录的表转换为记录的表,以及将记录的表转换为未记录的表的例程,使用与vacuum full相同的算法,只是它将为新的relfilenode设置不同的relpersistence。
提出的解决方案已经与 PostgreSQL 社区进行了讨论。[[1]]
项目时间表
截止 5 月 19 日
- 为项目创建一个网站([[2]])
- 为项目创建一个公共仓库([[3]])
- WIP 补丁在 [4]
- 阅读社区关于该项目已有的讨论 ([[5]])
- 如 pgsql-hackers 邮件列表中已经讨论的那样,此功能将类似于“vacuum full”进行实现,只是它将为新的“relfilenode”设置不同的“relpersistence”。
- 了解一些 PostgreSQL 内部机制
- 语法 (src/backend/parser/gram.y)
- vacuum full (src/backend/commands/[vacuum.c | cluster.c])
- 与社区讨论附加目标
5 月 19 日 - 6 月 23 日
- 第一个原型的实现
- 更改 PostgreSQL 语法以支持“ALTER TABLE … SET LOGGED”
- 实现或调整例程以将“未记录的”表更改为“记录的”(类似于“vacuum full”)
- 编写文档和测试用例
- 将第一个原型提交到 2014/06 的 commitfest([[6]])
6 月 23 日 - 6 月 27 日
- 导师审核正在进行的工作
6 月 27 日 - 8 月 18 日
- 根据 2014/06 的 commitfest 期间社区的反馈进行调整
- 第二个原型的实现
- 更改 PostgreSQL 语法以支持“ALTER TABLE … SET UNLOGGED”
- 提交到 2014/09 的 commitfest 以进行最终评估,并可能被提交到 9.5 版本(网页尚未创建)
8 月 18 日 - 8 月 22 日
- 根据 2014/09 的 commitfest 期间社区的反馈进行调整
- 最终导师审核
关于提案人
Fabrízio de Royes Mello
目前,我帮助个人和团队充分利用关系型数据库,特别是 PostgreSQL,帮助团队设计数据库结构(建模)、构建物理架构(数据库模式)、编程(过程语言)、SQL(使用、调优、最佳实践)、优化和生产环境中实例的编排。我为巴西 PostgreSQL 社区 (www.postgresql.org.br) 做志愿者工作,支持邮件列表、组织活动 (pgbr.postgresql.org.br) 和一些管理任务。我还帮助 PostgreSQL 全球开发组 (PGDG) 实现一些功能和审核补丁 (git.postgresql.org)。