锁争用
减少锁定冲击
使用 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




