【问题标题】:Performance Typed Column x Distinct Table性能类型列 x 不同表
【发布时间】:2013-02-26 13:28:51
【问题描述】:

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

例如:

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    
)

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

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

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

【问题讨论】:

  • 取决于您的查询。除了性能之外,还有另一个(更严重的差异)。在第二种设计中,您不能拥有引用 AllInOne 表的外键,您只能单独引用 3 个表中的任何一个。反之亦然。
  • 同意 ypercube。如果你按照这个论点得出它的逻辑结论,那么你在任何数据库中都只会有一个表,只是有很多列......
  • @ypercube 重新表述了这个问题
  • @Paddy 重新表述了这个问题

标签: sql sql-server performance conceptual


【解决方案1】:

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

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

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

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

【讨论】:

  • 太好了! oracle也有吗??
  • 你是说分区?是的,非常喜欢
猜你喜欢
  • 2012-11-07
  • 2016-01-19
  • 2019-10-30
  • 2011-10-16
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多