PGSQL读提交级别的事务实践

读提交级别下的实践

事务1 事务2
BEGIN  
select *, xmin, xmax from time_test;  
  update time_test set time = '1456' where id = 1;
select *, xmin, xmax from time_test;  
  BEGIN;
  ​update time_test set time = '1457' where id = 1;
select *, xmin, xmax from time_test;  
select *, xmin, xmax from tim
### PostgreSQL 批量删除大量数据的最佳实践 #### 使用分页技术减少锁竞争内存消耗 为了防止长时间持有表级别的锁并降低对系统资源的影响,在执行大规模删除操作时应采用分页方式。具体实现可以通过 `LIMIT` `OFFSET` 来逐步处理待删记录集,每次只提交一部分变更。 ```sql WITH deleted_rows AS ( DELETE FROM target_table WHERE id IN (SELECT id FROM target_table ORDER BY id LIMIT 500 OFFSET 0) RETURNING * ) SELECT count(*) FROM deleted_rows; ``` 此方法允许设定合理的批次大小(如每批不超过500条),从而有效控制单次事务影响范围[^1]。 #### 利用临时表提高效率 当存在复杂筛选条件或关联其他表格的情况时,先将符合条件的数据ID提取到一个临时表内,再基于该中间结果实施批量移除动作会更加高效稳定: ```sql CREATE TEMP TABLE temp_ids_to_delete ON COMMIT DROP AS SELECT id FROM source_table WHERE some_condition; BEGIN TRANSACTION; DELETE FROM main_table USING temp_ids_to_delete ttd WHERE main_table.id = ttd.id; COMMIT; ``` 这种方式不仅有助于简化最终的删除命令结构,而且可以在必要时候方便地回滚部分已完成的操作[^2]。 #### 控制事务规模保障稳定性 考虑到并发访问场景下的性能表现及潜在风险因素,建议保持较小的事务粒度——即频繁提交而不是累积过多更改后再统一确认。这能显著缩短锁定时间窗口,并减轻日志文件增长压力。 ```sql DO $$ DECLARE batch_size INT := 1000; -- 定义每轮循环要处理的数量 total_deleted INT := 0; BEGIN LOOP WITH deleted_records AS ( DELETE FROM mytable WHERE ctid IN (SELECT ctid FROM mytable FOR UPDATE SKIP LOCKED LIMIT batch_size) RETURNING 1 ) SELECT COUNT(*) INTO total_deleted FROM deleted_records; EXIT WHEN total_deleted < batch_size; RAISE NOTICE 'Deleted % rows', total_deleted; END LOOP; END $$ LANGUAGE plpgsql; ``` 上述PL/pgSQL匿名代码块展示了如何利用CTID伪列配合FOR UPDATE子句来安全可靠地完成大批量行级删除作业的同时维持良好的响应速度与鲁棒性[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值