性能类型化列x不同表

问题描述:

就性能或查询优化而言,不同表和类型列之间存在差异?性能类型化列x不同表

例如:

Create Table AllInOne(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null, 
    OneType Integer Not Null 
) 

凡OneType仅接收对战以下结构1,2或3(整数值)

Create Table One(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table Two(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table Three(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

另一种可能的结构:

Create Table Root(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table One(
    Key Integer Primary Key references Root  
) 

Create Table Two(
    Key Integer Primary Key references Root  
) 

Create Table Three(
    Key Integer Primary Key references Root  
) 

在第三种方式中,所有数据都将设置在根和与一个,两个和三个表的关系中。

我前几天问过我的老师,如果有任何区别,他不能回答。我们假设我必须在这三种方法中进行选择。
假设常用的查询正在过滤该类型。并没有引用这些表的子表。

为了更容易理解,我们来考虑一下工资系统。
One = Incomings
两个=折扣
三=计算基数。

+3

取决于您的查询。除了表现之外,还有另一个(更严重的区别)。在第二种设计中,不能有引用“AllInOne”表的外键,您只能单独引用任何3个表。另一种方式。 – 2013-02-26 13:32:28

+0

同意ypercube。如果你遵循这个论点来得出合乎逻辑的结论,那么你只能在任何数据库中有一张表,只是有很多列... – Paddy 2013-02-26 13:58:10

+0

@ypercube改写了这个问题 – EProgrammerNotFound 2013-02-26 14:19:02

具有单独的表格(如(2)中所示)意味着需要访问特定OneType数据的人员可以忽略其他类型的数据,从而减少表扫描的I/O。另外,(2)中表中的索引会更小并且可能更少,这意味着索引访问的I/O更少。

鉴于OneType的高选择性,索引无助于(1)中的过滤。但是,表分区可以用来获得上面提到的所有好处。

还会有额外的好处。查询(2)时,您需要知道需要哪个OneType才能知道要查询哪个表。在(1)的分区版本中,不必要分区的分区消除可以通过where子句谓词中提供的值来实现,这使得该过程变得更加容易。其他好处包括更简单的数据库管理(当您将列添加到分区表中时,它会被添加到所有分区中),更容易扩展(为新的OneType值添加分区很容易)。另外,如前所述,该表可以被外键作为目标。

+0

太棒了!对于甲骨文来说呢? – EProgrammerNotFound 2013-02-27 10:47:45

+0

你的意思是分区?是的,非常非常 – muhmud 2013-02-27 11:16:43