在Postgres数据库中,关系约束是否会降低性能?

时间:2014-04-07 14:47:44

标签: performance postgresql constraints relational integrity

这是我在这里的第一篇文章,我已经尝试过做作业了。

我需要有更好的方法为Postgres开发数据仓库数据库,而不是使用Power * Architect。这是完整的悲伤历史:

我使用Data Warehouse开发,主要是在免费/开放平台上(Linux + Postgres。)我创建的所有表都没有任何关系,因为在DW环境中,FK执行几乎没有增值。这是因为我完全控制了表格中的内容。此外,在进行一些维护(如更新或删除错误的行)时,这些约束会增加额外的工作,因此我将它们保留下来。

要为这些DW数据库建模我必须绘制图表,并且最好显示哪个表与外键/主键相关。看到这种关系有助于模型与客户的沟通以及它的发展。

但是,大多数数据库建模器(如Power Architect)都会生成实际创建约束的代码。除了自己修改Power Architect代码之外,没有办法阻止它这样做。

这就是问题真正触及我的时候:当我开始进化模型时,每当我检查当前数据库(我完全没有关系)对我的模型(充满FKs关系线)来找到什么(表,列,索引)要改变,Power * Architect抱怨缺少关系,并且"善意"生成代码来创建它们。我必须阅读diff执行大量的思维过滤(尝试在不接受添加约束命令的情况下读取代码),并且在将diff' s SQL应用于我的数据库时,我必须手动删除这些命令。

如果像在Oracle上一样,我可以命令Postgres关闭关系限制,那就不会有问题了。我可以在Power * Architect上保留整洁的图表,而不必担心数据库中的关系。但我不能(而且我永远不会转向Oracle。)因此,如果我可以一直保留这些约束,如果它不会显着降低对数据库的查询,那么我的问题就会得到解决。我可以在写作时处理一些性能损失,只要它在徘徊或低于10%降级(如插入1' 06"而不是1' 00"。)

所以,问题是

"在进行大量写作时,是否有任何重大的性能损失,对FKs关系约束生效的Postgres表进行一些小的更新和删除?"

根据这些帖子Does Foreign Key improve query performance?http://www.experts-exchange.com/Database/MS-SQL-Server/A_4293-Can-Foreign-key-improve-performance.html,MS SQL Server在写入时会降低性能,并且在阅读时可能会有一些性能提升。这是一般规则吗? Postgres的表现是否相似?我环顾四周,并没有找到答案。这个回答https://stackoverflow.com/a/83527/3507015评论NO ACTION标志。那是否能完成这项工作(我的意思是,在没有惩罚表现的情况下建立关系)? (Postgres有这个选项但是根据http://www.postgresql.org/docs/8.1/static/ddl-constraints.html它似乎没有采取行动"但是不允许采取任何行动。)

当然最好让数据库设计师具有与Power * Architect相同的功能(数据库反向/正向工程,数据库/模型比较等),这样我就可以绘制线条,但不要求它们实际创建为在我将模型与数据库进行比较时,约束都没有尝试创建它。

很抱歉让一个帖子太长,无法提出一个问题。

1 个答案:

答案 0 :(得分:2)

是的,性能受到了影响。

如果在关系的引用端有insertupdate,PostgreSQL必须对引用的唯一键执行索引查找,以验证相关节点是否存在。但是,只有在实际的键字段发生变化时才需要这样做。

如果来自引用方的updatedelete,PostgreSQL必须在指向密钥的每个关系的引用端进行查找,确保没有行目前依赖于被删除的引用行。除非你在引用方面有一个索引,否则这会导致极慢的seqscan - 在这种情况下它仍然是索引查找,你必须支付维护你可能不需要的索引的成本。

可以禁用PostgreSQL中的FK。它们是触发器,就像任何触发器一样,它们可能被禁用。你不能在全球范围内这样做,你必须为每个表格做到这一点,但你的工具很可能不会注意到他们被禁用并尝试“修复”它们。

请注意,允许PostgreSQL的查询规划器依赖外键的有效性,如果不强制执行关系,则可能导致查询产生不正确的结果。在实践中,我认为规划师此时并没有对FK做任何事情(只有检查和唯一约束)所以它应该不重要。