【发布时间】:2015-04-23 08:50:53
【问题描述】:
我们有以下设置:
- 服务器 SRV_1 有两个数据库:OLTP 数据库 DB_APP 和报告数据库 DB_REP。
DB_APP 有许多触发器,它们执行一些数据转换(非规范化,使用连接到其他表来匹配非规范化数据)并将数据插入/更新到 DB_REP - SRV_1 具有从 DB_REP 发布数据的事务复制
- SRV_1 上很少有作业会根据 DB_APP 中的数据定期修改 DB_REP 中的数据
- DB_REP 不被任何应用程序使用,它只是一个复制源
- 服务器 SRV_2 是一个报告服务器,它订阅 DB_REP 并将其提供给客户。
问题在于 DB_APP 很少有经常更新的表,并且触发器会造成非常沉重的 CPU 负载。最常更新的表之一每秒大约有 100 次更新。
优化此设置的最佳方法是什么?到目前为止,我正在考虑这样的事情:
- 尽量优化触发器(现在他们使用是否存在检查来执行插入/更新,我可以用 MERGE 替换它)
- 创建索引视图而不是触发器并将视图从 DB_APP 复制到 DB_REP
- 删除触发器、删除 DB_REP 并使用复制存储过程 sp_msins_xxx 直接从 DB_APP 发布复制,并实现数据转换。我不确定是否可以在这些过程中查询其他表。以及如何处理工作?
【问题讨论】:
标签: sql-server database triggers replication