问题描述
|
哈o
我正在编写一个数据库应用程序,它使用伪造的“ 0”隔离级别(“ 1”)进行大量插入和更新。
为了不进行大量网络往返,我要在一笔交易中以2英镑的价格批量插入和更新。它们很少会失败,因为插入已经过预先检查,并且几乎与其他事务没有冲突,因此回滚不会经常发生。
拥有大笔交易应该对WAL有利,因为它可以刷新大块数据,而不必为小型交易而刷新。
1.)我只能看到大笔交易的积极影响。但是我经常读到它们很糟糕。为什么在我的用例中它们不好?
2.)将“ 3”合并回真实数据库时,检查冲突是否如此昂贵?数据库将必须比较所有可能冲突的写入集(并行事务)。还是做一些高速捷径?还是便宜吗?
[编辑]如果有人可以使快照隔离数据库如何检查在时间轴上具有重叠部分的事务是否被检查为分离的写集,可能会很有趣。因为这就是假的可序列化隔离级别的全部含义。
解决方法
真正的问题有两个方面。第一个可能的问题是膨胀。大型事务可能会导致立即显示很多死元组。另一个可能的问题是长期运行的事务。只要运行了一个长期运行的事务,就无法清理它涉及的表,因此也可以收集大量的死元组。
我想说的只是使用check_postgresql.pl检查是否有腹胀问题。只要您在长时间的交易后没有看到太多的桌子膨胀,就可以了。
, 1)手册说它很好:http://www.postgresql.org/docs/current/interactive/populate.html
我也建议您先使用COPY,删除索引(但先进行测试),增加maintenance_work_mem,增加checkpoint_segments,然后运行ANALYZE(或VACUUM ANALYZE)。
如果您不确定,我不会推荐您:删除外键约束,禁用WAL归档和流复制。
2)始终在提交时合并数据,但是没有检查,只是写入数据。重读:http://www.postgresql.org/docs/current/interactive/transaction-iso.html
如果您的插入内容/更新不依赖于其他插入内容/更新,则不需要“完全一致的视图”。您可以使用已提交读操作,并且事务将永远不会失败。