PostgreSQL 数组和连接的性能比较

10

在Postgres中,使用数组存储值与创建另一个具有“一对多”关系的表来存储值相比,会产生什么性能影响?

我有一个表需要能够在数组列或单独的表中存储1-100个不同的字符串值。这些值需要经常被搜索以进行精确匹配,因此查询性能至关重要。是使用数组解决方案更快,还是使用连接在单独的表中查找值更快?


8
优化是最后一步。首先要做正确的事情,也就是适当地进行规范化处理。 - Clodoaldo Neto
这取决于许多因素,包括您可能在每个字段上使用哪些索引以及其类型,您将如何查询数据以及许多其他事情。我同意@ClodoaldoNeto的评论...先让您的代码正常工作,然后再考虑优化。 - Jonathan Hall
1
顺便提一下,如果您要将字符串存储在数组中,可能需要在此数组上添加GIN索引。阅读Postgres文档以了解GIN索引的详细信息。 - Ihor Romanchenko
2个回答

4
这些值需要频繁搜索,搜索的方式是怎样的?这很关键。只有前缀模式匹配吗?中/后缀模式匹配呢?模糊字符串搜索/相似度匹配?对于根词进行存根和规范化的去复数处理?同义词搜索?数据是字符序列还是自然语言文本?一个语言或多种不同的语言?
如果忽略"搜索"这部分,任何回答都几乎无效。
因此,查找性能至关重要。使用数组解决方案是否更快,还是使用连接在单独的表中查找值更快?
如果没有足够的数据信息,就无法确定。
搜索文本字段更加灵活,让您拥有许多数组搜索所没有的选项。它也通常减少必须读取的数据量。
总之,我强烈支持Clodaldo的观点:正确设计,以后再优化,如果需要的话。

感谢您的回答。字符串值需要搜索Unicode文本的精确字符串匹配。 - Mike

0
根据官方的PostgreSQL参考文档,搜索表中特定元素的性能比数组要好。但是,https://www.postgresql.org/docs/current/arrays.html#ARRAYS-SEARCHING

数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑使用单独的表格,每个项目都是一个数组元素的行。这将更容易搜索,并且对于大量元素来说,很可能会扩展得更好。

数组元素的搜索性能较差的原因可能是数组在内部存储为字符串,如https://www.postgresql.org/message-id/op.swbsduk5v14azh%40oren-mazors-computer.local所述。

实际上,Postgres将数组存储为字符串。一个带有许多括号的字符串。

虽然我无法通过任何官方的PostgreSQL文档来证实这个说法。我也没有任何证据表明处理结构良好的字符串一定比处理表格性能差。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接