2013-02-12 53 views
1

我知道对于像Postgresql这样的关系型数据库,使用分隔表格会更有效,但我关心的是性能问题,因为执行最多的查询将使用UNION ALL从多个表中获取行。使用UNION ALL从多个表中获取行或在生产中使用一个表?

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

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

在该解决方案我必须使用3种不同的查询合并在生产UNION ALL和该查询将执行记录在系统(该系统中所执行查询)

用户

另一个是:

table -> column1, column2, typeColumn, extraColumnForTable3 

在该溶液我要创建一个额外的列typeColumn区分行是哪种类型。而且我还必须为类型table3创建一个列extraColumnForTable3,对于table2table1类型,它将为NULL。在此解决方案中,执行最多的查询将只包含一条SELECT声明。

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

+2

“分隔桌子”?分离是[规范化](http://en.wikipedia.org/wiki/Database_normalization)的结果。如果执行得最多的查询执行该联合,那么很可能您的数据结构不是传统意义上的标准化,而是您只有代表同一事物的专业化的表格,而不是表示泛型和专业化的表格包含对通用中该行的引用。 – Matt 2013-02-13 19:18:50

回答

0

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

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

分解表的主要问题是这种陈述很常见,这是因为它使得主键和外键管理相当成问题。总的来说,确保您的数据结构首先是清晰可管理的,然后担心优化,而不是担心优化,然后尝试使优化的解决方案易于管理,这几乎总是好得多。

相关问题