数据库设计:分区表与规范化表

时间:2011-03-18 18:39:47

标签: sql database-design

我的新闻稿应用程序有两个表: tblIssue tblIssueSubscriber

这是我的标准化设计:

 tblIssues (newsletter issues masterlist)
 --------------------
 IssueId int PK
 PublisherCode varchar(10)
 IssueDesc varchar(50)


 tblIssueSubscribers (newsletter subscribers)
 -----------------
 IssueId int FK
 EmailAddress varchar(100)

但是tblIssueSubscriber预计每周会有数十万甚至数百万的记录,并且它会被频繁访问,这就是为什么我倾向于表分区。我的设计是 按照PublisherCode 分区tblIssueSubscriber (我们的主列表上有8个publisherCode)。

 tblIssues
 --------------
 IssueId int PK
 PublisherCode varchar(10)
 IssueDesc varchar(50)


 tblIssueSubscribers
 -----------------
 IssueId int FK
 PublisherCode varchar(10)
 EmailAddress varchar(100)

然后按PublisherCode

对其进行分区
 CREATE PARTITION FUNCTION [PartitionPublisher] (varchar(10)) AS RANGE RIGHT FOR VALUES  ('PUBLISHER1', 'PUBLISHER2', 'PUBLISHER3', 'PUBLISHER4', 'PUBLISHER5', 'PUBLISHER6', 'PUBLISHER7', 'PUBLISHER8');

我知道表分区会增加复杂性,所以我的问题是,

  

是否值得分区tblIssueSubscriber,或者我应该坚持   规范化设计?

3 个答案:

答案 0 :(得分:3)

首先我认为尺寸是红鲱鱼。它不是一个非常有用的参数,因为所有大小都是相对的,并且有理由使用分区而不管大小。

表现只是其中一部分原因。罗尼斯提出了一些好处,但并不止于此。

分区表有两个原因。一个是性能,一个是维护。

让我们从维护开始吧。

一般情况下,DELETE在数据库中是一个“坏”的事情。假设您错误地插入了100万行,然后删除了100万行。记录这些删除中的每一个都会生成UNDO和REDO记录,这会浪费空间并且不仅需要花时间删除,而是在“播放”时进行时间点恢复。那么什么比删除更好?截断(或删除)。当你描述的表格不断增长时,你会想要摆脱旧记录。这就是为什么我说大小是无关紧要的 - 如果你想在该表中保留一年,你需要删除超过12个月的记录 - 无论大小是什么。添加记录1年后,您可以拥有300MB表或500GB表 - 无论您是否需要/想要开始删除。所以你总是可以用insert_dt<删除行。 sysdate - 365.或者您可以删除或截断该月/日的分区。未记录的事务,资源消耗较少。

还有其他维护优势,例如单独备份分区或重建索引或迁移到新的表空间等。不确定您使用的是哪种RDBMS,但您可以通过分区交换在大多数情况下加载数据。这使您无需更改最终表,直到所有数据都已加载并准备就绪。

就性能而言......

这里的关键是,任何不包含where子句中的分区键的查询很可能比分区之前执行的更糟糕。这不是GO_FASTER = TRUE类型的设置。我见过人们实现分区并破坏他们的系统。 Ronnis的帖子是单个分区表中性能指南的基础。如果在同一个键上有多个表分区,则某些RDBMS可以并行化它们之间的连接。

答案 1 :(得分:1)

这实际上取决于该数据库文件的大小以及您将在那里拥有多少条记录以及您正在使用的计算机。粗略计算一下你认为它会变得多大。

粗略地说,假设数据库文件将增长到300 MB?

这没什么......我个人不会对它进行分区。我知道一些使用分区的数据库客户端,当他们期望数据库增长到500 GB以上并且最终可能达到4 TB时,他们就开始分区了。在那种情况下,是分区。但我怀疑你不会去那附近。

另外,您可以随时进行分区,不是吗?

我建议使用运行Linux或Windows Server 2008 / Win7的64位计算机。更多的记忆总是好的。

答案 2 :(得分:1)

查询模式将决定您是否将从分区中受益。

如果您的应用程序主要是关于单行查询(通常是主键或索引访问),则不会通过对表进行分区来获得性能提升。

如果您的应用程序主要是关于处理所有数据发布者,那么在执行表扫描时,通过消除表的较大部分,您将从分区中受益。