计算列在SQL Server 2005数据库中的性能影响?

时间:2008-09-22 19:21:59

标签: sql-server performance tsql database-design calculated-columns

情况:我们有一个包含许多非规范化表的大型数据库。我们经常需要重新汇总数据以使汇总表保持同步。我们已经谈论过使用计算列来保持数据新鲜。我们也讨论了触发器,但这是一个单独的讨论。

在我们的汇总表中,我们对表进行非规范化,使标准ID和标准描述存储在表中。这本身假设表格将经常被重新填充,以便如果它们更改标准描述,它也将在摘要表中更改它。 一个不好的假设。

问题: 如果我们在摘要表中的标准描述中使用派生/计算列来从标准表中选择标准描述,该怎么办? 通过在具有100,000-500,000行的表上删除计算列,是否会产生巨大的性能损失?

3 个答案:

答案 0 :(得分:1)

当计算列不是计算密集且不在大量行上执行时,它们很好。你的问题是“通过删除计算列会有什么打击。”除非此列是查询使用的索引(真正的坏主意索引编译 - 我不知道你是否可以依赖于你的数据库),然后删除它不会损害你的性能(更少的数据查询和紧缩)。

如果标准表具有描述,那么您应该从id加入它而不使用任何计算。

您提到了可能是一个真正的问题,那就是数据库的架构。之前我遇到过这样的问题,系统是为处理一件事而构建的,而报告需要用螺栓固定在其上。如果不重构您的架构以平衡所有需求,Sunny的使用视图的想法只是唯一简单的方法。

如果您想发布一些已清理的DDL和数据,以及您尝试从数据库中获取的示例,我们可能会给您一个不太主观的答案。

答案 1 :(得分:1)

表中的计算列只能从该行的值派生。您不能在计算列中进行查找。为此你需要一个视图。

在表格中,将名称小规范化为表格可能会产生可忽略不计的性能影响。您可以使用DBCC PINTABLE提示服务器将表保留在缓存中。

如果您需要实时更新,那么您的唯一选择就是触发器。在与要更新的名称对应的ID列上放置聚簇索引应该减少总体I / O量(给定ID的记录将在同一块或一组块中)所以如果触发器正在引起,请尝试这样做表现问题。

答案 2 :(得分:0)

只是为了澄清sql2005及以上的问题:

  

引入了此功能   SQL Server 6.5版中的性能。   DBCC PINTABLE非常不受欢迎   副作用。这些包括   可能会破坏缓冲池。   DBCC PINTABLE不是必需的并且有   被删除以防止额外的   问题。此命令的语法   仍然有效,但不影响   服务器