arrays - PostgreSQL 数组可以针对连接进行优化吗?

标签 arrays postgresql postgresql-performance

我发现如果数组的元素是数据本身,例如标签,PostgreSQL 数组对性能有好处

http://shon.github.io/2015/12/21/postgres_array_performance.html

如果我使用数组作为存储整数外键的方式怎么样?排除外键约束问题,用整数数组存储外键是否可取?

应用应针对报告或分析进行优化。因此,如果应用程序最终会在大多数情况下将数组连接到表中,比如说应用程序需要显示外键的标签/标题/名称,是否仍然可以使用数组来存储外键?

与使用联结表相比,当数组较小时性能会更好吗,比如电影类型整数的复选框?

如果数组以千为单位,不使用数组而只使用联结表性能会更好吗?

最佳答案

不,将 FK 存储在数组中对于通用表来说绝不是一个好主意。首先,您顺便提到了一个事实:未实现数组元素的外键约束(对于 Postgres 14 仍然如此)。仅此一项就应该使这个想法无效。

曾尝试实现 Postgres 9.3 的功能,但因严重的性能问题而停止。看这个thread on pgsql-hackers.

此外,虽然在某些用例中使用数组可以提高读取性能,但写入性能会直线下降。想一想:要从长数组中插入、更新或删除单个元素,您必须使用整个数组编写一个新的行版本。我也看到了严重的锁争用。

如果您的表只读,这个想法开始变得更有意义。但后来我会考虑 materialized view在规范化的多对多实现的之上使用非规范化数组。见:

同时,MV 可以包含所有连接表并生成一个平面表以获得更好的读取性能(对于典型用例)。通过这种方式,您可以获得参照​​完整性良好的读取(和写入)性能 - 以管理 MV 的开销和额外存储为代价。

关于arrays - PostgreSQL 数组可以针对连接进行优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38156345/

相关文章:

javascript - JS : find lowest/highest number from array within a specific range

c++ - opencv 二进制数据 jpg 图像到 cv::Mat

Postgresql 9.6 initdb 在 Centos 7 docker 容器中失败

sql - LIMIT 的小结果查询比 100 行以上的查询慢 1000 倍

sql - 使用 ARRAY_AGG 获取列中的第一个非 NULL 值是否浪费?

c - 从文件中读取值

php - 如何在php中的数组中插入新的键值对?

c - C 中仅通过指针在字符串数组之间交换

node.js - Sequelize .create 没有为我的模型生成内容

sql - Postgres : Why did adding index slow down regexp queries?