规范化还是不规范化?什么表现更好?

时间:2014-08-12 14:51:55

标签: sql performance normalization

多个已连接的规范化表是否会比1个非规范化表更快地返回查询?我对read(select)语句的性能感兴趣,而不是插入,删除,更新。

我相信规范化的连接表会更快地返回选择查询,但我也听说过,因为所有数据都在一行中有1个非规范化表,所以非规范化表更快地返回查询。

我试图找到它,所以我可以改进Tableau上的可视化渲染,所以我关心表的读操作,而不是写。

任何澄清这种混乱都将受到赞赏。

3 个答案:

答案 0 :(得分:3)

如果您正在处理静态数据仓库,有时处理非规范化数据会更好,特别是对于您可能在数据中感兴趣的任何类型的聚合/汇总值。在非常大的数据集上预先汇总表格是好的,但不知道更多的数据上下文,我可以提供最好的答案。

从您的评论中澄清......

假设您正在处理(例如:我过去曾与之合作过的)政府合同并为2010 - 2012年度提供数据。数据本身不会改变......谁获奖,政府部门,小型/大型企业分类,金额等等。这些价值观不会真正改变,所以如果你想知道哪些公司被授予了多少每个州政府,每个州,每个行业等。拥有预先计算总数将节省时间。

从执行数据输入的另一个系统(例如插入/更新/删除的销售活动)中拥有一个只读显示系统(仅查询),您显然应该保持标准化模式作为基础数据即使您提供只读查询权限,也会再次更改..

答案 1 :(得分:2)

很明显,获取查询结果的最快方法是,如果它已经预先构建并准备好在单个表中进行检索。

然而,从维护的角度来看,这是不切实际的。

将大多数数据保存在规范化表格中通常是一个很好的建议,但请参阅DRapp的答案,了解有时使用非规范化的情况。

答案 2 :(得分:2)

正如其他人所指出的那样,这非常依赖于这种情况。如果您需要一流的性能,您可以做的最好的事情是生成一些测试,看看事情是如何运作的,然后实施最快的解决方案。创建一组非规范化表,一组规范化表,并运行一些查询并查看它们执行的速度。从那里开始。

但是,除非你有大量的数据,速度可能不是你最关心的问题。现代RDBMS非常有效,特别是在适当的索引等的情况下。您可能最好不要询问规范化或非规范化表对您正在进行的工作是否更具逻辑性。您可能还会认为规范化表的最大参数之一是它们有助于防止数据错误。考虑对标准化进行一些背景阅读以解释此问题。如果您想确保您的数据尽可能干净,您可能需要进行标准化,即使您的性能受到轻微影响。