使用UNION ALL从多个表中获取行还是在生产中使用一个表?

时间:2013-02-12 13:23:26

标签: postgresql database-design relational-database rdbms

我知道对于像Postgresql这样的关系数据库使用分离的表会更有效但是我对性能问题感到担忧,因为执行最多的查询将使用UNION ALL从多个表中获取行。

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

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

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

另一个是:

table -> column1, column2, typeColumn, extraColumnForTable3

在这个解决方案中,我必须创建一个额外的列typeColumn来区分该行的类型。我还必须为类型extraColumnForTable3创建一个列table3,对于table2table1类型,它将为NULL。在此解决方案中,执行最多的查询将仅包含一个SELECT语句。

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

1 个答案:

答案 0 :(得分:1)

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

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

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