非规范化会提高 SQL 的性能吗? [关闭]

Posted

技术标签:

【中文标题】非规范化会提高 SQL 的性能吗? [关闭]【英文标题】:Will denormalization improve performance in SQL? [closed] 【发布时间】:2014-06-06 20:48:44 【问题描述】:

我想加快我们的 SQL 查询速度。我已经开始阅读一本关于数据仓库的书,其中您有一个单独的数据库,其中包含不同表中的数据等。问题是我不想为我们的每个客户创建一个单独的报告数据库,原因如下:

    我们有200多个,对这些数据库进行维护就足够了 报告数据必须立即可用

我想知道,我是否可以简单地对我报告的表进行非规范化,因为目前有很多 JOIN 并且认为这些很昂贵(表中大约有 20,000,000 行)。如果我将数据复制到多个表中,这会大大提高性能吗?我知道数据被复制到各处存在问题,但这也有利于历史观点。

【问题讨论】:

您使用的是什么 SQL 数据库引擎,什么版本?您是否充分探索过 sql 调优,看看可以将哪些额外的性能提升应用到您现有的设计中? 这个范围很广。您是否考虑过在dba.stackexchange.com 上提问? 抱歉,我使用的是 SQL 2008 R2 SP3。 【参考方案1】:

非规范化并不能保证性能的提高。

您是否考虑过调整应用程序的查询?查看正在运行的报告,确定可以添加索引和分区的位置。也许大多数报告只查看最后一个月的数据——您可以按月对数据进行分区,因此查询时只需要读取少量的表。如果替代方案是需要大量全表扫描而不是几次索引扫描的大型非规范化表,则 JOIN 不一定很昂贵...

您的问题过于笼统 - 与您的 DBA 讨论对报告查询进行一些跟踪(并查看计划),以了解您可以采取哪些措施来帮助提高报告性能。

【讨论】:

即使是确保您拥有最近更新的表格统计信息这样简单的事情也会有所帮助。 对不起,如果问题过于笼统,但我们的系统允许用户生成自己的报告,因此一个数据库中的报告可能与另一个数据库中的报告完全不同。恐怕我们公司没有DBA,因此我正在努力提高自己的绩效。我在最常用的表上有索引,但我不是 DBA【参考方案2】:

这个问题很笼统。很难回答非规范化是否会提高性能。

基本上,它可以。但就个人而言,我不会考虑将非规范化作为报告问题的解决方案。在我的实践中,业务人员喜欢构建 huuuge 报告,这将在最不合适的时间内杀死 OLTP DB。我会继续阅读数据仓库:)

【讨论】:

【参考方案3】:

是的,对于 OLAP 应用程序,您的性能将通过非规范化提高。但是,如果您对 OTLP 应用程序使用相同的非规范化表,您将在那里看到性能瓶颈。我建议您也为您的报告目的创建新的反规范化表或物化视图,并且您可以逐步快速刷新您的 MV,以便您立即获得报告数据。

【讨论】:

非规范化本身并不能保证性能提升。 @NWest 在 DatawareHouse 中它保证了性能改进,因为连接 10 个表以生成报告总是很昂贵,然后从非规范化表中获取相同的数据。 @NWest,当然不能保证。没有具体方案的分析,没有任何保证。然而,“在计算中,非规范化是试图通过添加冗余数据或对数据进行分组来优化数据库读取性能的过程。” link 这完全取决于他们的查询。 2 亿行不必要且非常宽的页面的 FTS 找到我想要的 3 个,什么时候我可以使用索引和连接快速丢弃 95% 的我不需要扫描的数据? 我并不是说它不能提高性能。我已经构建了许多性能出色的星型模式。告诉人们“为了性能而去规范化”而不给出如何的指示是很危险的。此答案中建议的查询(快照)的具体化视图是一种非常粗糙的方法,并且可能导致维护噩梦。

以上是关于非规范化会提高 SQL 的性能吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL插入非常慢[关闭]

在 SQL Server 中自动更新冗余/非规范化数据

SQL 连接与单表:性能差异?

关于非规范化。我怎样才能使这个查询更短或更好? (SQL SERVER 2000)[关闭]

我可以在为 bigquery 做准备时对谷歌云 sql 中的数据进行非规范化吗

触发器与非规范化存储过程的优缺点