2

我知道对于像 Postgresql 这样的关系数据库,使用分隔表会更有效,但我担心性能问题,因为执行次数最多的查询将使用UNION ALL.

我必须选择处理这个问题。第一个是:

table1 -> column1, column2
table2 -> column1, column2
table3 -> column1, column2, column3

在这个解决方案中,我必须在生产中使用 3 个不同的查询合并,UNION ALL这个查询将由登录系统的用户执行(系统中执行次数最多的查询)

另一个是:

table -> column1, column2, typeColumn, extraColumnForTable3

在这个解决方案中,我必须创建一个额外的列typeColumn来区分该行是哪种类型。而且我还必须extraColumnForTable3为该类型创建一个列,并且类型table3为 NULL 。在此解决方案中,执行次数最多的查询将仅包含一条语句。table2table1SELECT

生产中将有数百万行,所以我担心性能。NULL值可能会在数据库中占用额外的空间,但我认为它可以忽略不计。我将使用部分索引来消除 NULL 值,因此我认为它不会影响获取特定类型的其他查询。您认为哪一种在生产中更有效率?

4

1 回答 1

1

一般来说,我发现大量使用UNION表明数据库设计不好。在某些情况下,UNION它们UNION ALL是有意义的,但在递归公用表表达式之外它们应该是相对少见的。

PostgreSQL 提供了相当多的选项来保持单个表的性能可管理,并且正如您所指出的,部分索引是管理此问题的非常好的方法。

分解表以使此类UNION语句很常见的主要问题是它使主键和外键管理非常成问题。一般来说,首先确保您的数据结构清晰且易于管理,然后再考虑优化,这几乎总是比担心优化然后尝试使优化后的解决方案易于管理要好得多。

于 2013-04-26T14:13:40.797 回答