0

在查询的性能或优化方面,不同的表和类型列之间存在差异吗?

例如:

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    
)

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

我前段时间问过我的老师,他无法回答是否有任何区别。假设我必须在这三种方法之间进行选择。
假设常用查询正在过滤类型。并且没有引用这些的子表。

为了更容易理解,让我们考虑一个工资系统。
一 = 收入
二 = 折扣
三 = 计算基础。

4

1 回答 1

1

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

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

还会有额外的好处。查询时(2),需要知道需要哪个OneType才能知道查询哪个表。在 (1) 的分区版本中,可以通过 where 子句谓词中提供的值来消除不需要的分区,从而使过程更加容易。

其他好处包括更轻松的数据库管理(当您将列添加到分区表时,它会添加到所有分区),以及更容易扩展(为新的 OneType 值添加分区很容易)。此外,如前所述,表可以由外键定位。

于 2013-02-26T21:08:08.823 回答