【发布时间】:2011-01-06 12:43:43
【问题描述】:
当涉及到对事务数据库中的数据进行非规范化以提高性能时,有(至少)三种不同的方法:
通过存储过程推送更新,该存储过程同时更新规范化事务数据和非规范化报告/分析数据;
在更新辅助表的事务表上实现触发器;这几乎是维护历史时所采用的路线;
将处理推迟到夜间批处理,可能会在数据集市/仓库中执行 ETL。
出于这个问题的目的,我们假设选项 #3 不可行,因为域要求非规范化数据始终与规范化数据保持一致。我经常处理的分层聚合就是一个例子。
我已经相当多地使用了前两种方法,最近我一直倾向于基于触发器的方法,但我想知道是否有任何我尚未发现的“陷阱”,并认为值得提出这个问题,以便在将来做出长期决策时牢记一些想法。
那么根据您的经验,对于维护实时非规范化数据的特定目的,这两种工具的优缺点是什么?在什么情况下你会选择其中一种,为什么?
(附注:请不要回答“触发器太复杂”或“所有更新都应始终通过存储过程”之类的答案 - 使其适合问题的上下文。)
【问题讨论】:
-
使用物化视图进行非规范化不是更好吗?
-
@Enrique:物化视图不是灵丹妙药;有各种视图您实际上无法实现(甚至无法通过模式绑定创建),即使您可以,它们也具有与触发器大致相同的性能特征。
标签: database sql-server-2008 stored-procedures triggers denormalization