锁争用
减少锁定冲击
使用 CONCURRENTLY 命令
需要更长时间才能完成。 是非事务性的(不能处于事务块中,不能回滚)。 需要额外小心处理故障,这可能会留下部分变化(有FINALIZE清理或完成工作之类的命令)。
拆分复杂操作
ALTER TABLE mytable ADD COLUMN newcol timestamptz NOT NULL DEFAULT clock_timestamp();
复制
阻止所有并发访问(甚至SELECTs) 在整个表重写过程中持有锁 对于大型表可能需要几分钟甚至几小时
ALTER TABLE mytable ADD COLUMN newcol timestamptz DEFAULT clock_timestamp();
UPDATE mytable SET newcol = clock_timestamp() WHERE newcol IS NULL;
ALTER TABLE mytable ALTER COLUMN newcol SET NOT NULL;
复制
首先,添加具有默认值的可空列:ALTER TABLE mytable ADD COLUMN newcol timestamptz DEFAULT clock_timestamp(); 然后,填充任何NULL值:UPDATE mytable SET newcol = clock_timestamp() WHERE newcol IS NULL;您实际上应该分批执行此更新,请记住任何长时间运行的查询都可能导致问题。 最后添加NOT NULL约束:ALTER TABLE mytable ALTER COLUMN newcol SET NOT NULL;
初始列添加非常快,只需要短暂的ACCESS EXCLUSIVE锁 数据填充可以使用常规ROW EXCLUSIVE锁进行,从而允许并发操作 如果出现问题,每个步骤都可以回滚
单独验证约束
ALTER TABLE mytable ALTER COLUMN newcol SET NOT NULL;
复制
ALTER TABLE mytable ADD CONSTRAINT mytable_newcol_not_null CHECK (newcol IS NOT NULL) NOT VALID;
ALTER TABLE mytable VALIDATE CONSTRAINT mytable_newcol_not_null;
ALTER TABLE mytable ALTER COLUMN newcol SET NOT NULL; --optional
ALTER TABLE mytable DROP CONSTRAINT mytable_newcol_not_null; --optional
复制
首先,我们可以添加一个NOT VALID检查约束:ALTER TABLE mytable ADD CONSTRAINT mytable_newcol_not_null CHECK (newcol IS NOT NULL) NOT VALID; 然后验证约束:ALTER TABLE mytable VALIDATE CONSTRAINT mytable_newcol_not_null;扫描期间VALIDATE CONSTRAINT不会阻止写入。
Postgres 不断进步
ALTER TABLE mytable ADD COLUMN newcol int NOT NULL DEFAULT 1;
复制
新版本包括减少所需锁模式的优化。 新增CONCURRENTLY了 DDL 操作变体 锁定机制本身得到改进 以前长时间运行的操作可能会变成仅快速更改元数据
结论:平衡锁、性能和正确性
PostgreSQL 的锁定系统是确保数据一致性和并发性的强大工具,但它也是争用和瓶颈的根源。通过了解锁定的类型、其影响以及最小化锁定的策略,您可以有效地管理锁定并保持数据库的性能。
#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
明明想执行的SQL是DELETE、UPDATE,但为什么看到的是SELECT(FDW的实现原理解析)
小满未满、
395次阅读
2025-03-19 23:11:26
PostgreSQL初/中/高级认证考试(3.15)通过考生公示
开源软件联盟PostgreSQL分会
389次阅读
2025-03-20 09:50:36
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
298次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
256次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
239次阅读
2025-04-07 12:14:29
IvorySQL 4.4 发布 - 基于 PostgreSQL 17.4,增强平台支持
通讯员
231次阅读
2025-03-20 15:31:04
PG vs MySQL 执行计划解读的异同点
进击的CJR
164次阅读
2025-03-21 10:50:08
PostgreSQL分区管理扩展——pg_partman
chirpyli
133次阅读
2025-03-19 15:48:31
手把手教你在 openKylin 上部署 IvorySQL 4.4
严少安
125次阅读
2025-03-27 20:41:28
postgresql+patroni+etcd高可用安装
necessary
121次阅读
2025-03-28 10:11:23