Sql server 历史机制的最佳性能方法?
我们将通过触发器为DB中的更改创建历史机制(图中的DART) 我们有600张桌子 每个将被更改的记录-触发器将把删除的记录插入到XXX中Sql server 历史机制的最佳性能方法?,sql-server,performance,Sql Server,Performance,我们将通过触发器为DB中的更改创建历史机制(图中的DART) 我们有600张桌子 每个将被更改的记录-触发器将把删除的记录插入到XXX中 关于XXX: 选项1:克隆“Dart”数据库中的每个表,每个表现在将有一个“姐妹表” e、 g: Table1将有Table1\u历史记录 问题: 我们将有1200张桌子 程序员可以通过处理错误的表来犯错误 选项2:新建一个数据库(图中为DART_2005),历史记录表将显示在那里 选项3:使用链接的服务器,该服务器存储将包含历史记录表的数据库 问
关于XXX: 选项1:克隆“Dart”数据库中的每个表,每个表现在将有一个“姐妹表” e、 g:
Table1
将有Table1\u历史记录
问题:
- 我们将有1200张桌子
- 程序员可以通过处理错误的表来犯错误
选项2:新建一个数据库(图中为DART_2005),历史记录表将显示在那里
选项3:使用链接的服务器,该服务器存储将包含历史记录表的数据库
问题: 1)哪个选项的性能最好(我想3不是,但它是1还是2还是相同?) 2)选项2是否像“链接服务器”(在查询中,我们需要从两个数据库中选择…)
3)最佳实践方法是什么?1和2的性能相似;如果您当前受到数据库服务器上某些资源(例如磁盘IO)的限制,并且您有一个非常快速的可用网络,则选项3可能会更快 选项1将延长DART数据库的备份时间-这可能是一个问题 一般来说,我认为如果你的应用领域需要“历史”的概念,你应该把它作为一个一流的特性来构建。有几种方法可以做到这一点-查看有问题的链接
同样,总的来说,我不喜欢为这种需求使用触发器。您的触发器必须非常简单(在这种情况下,使用它在历史记录表中创建的数据并不总是那么容易),或者必须是智能的,在这种情况下,您的触发器需要做大量工作,这可能会使您的数据库模式在未来的发展中变得更加困难 这三种方法都是可行的,并且根据您的网络速度具有相似的性能,但是在有许多并发用户的系统上,每种方法都会给您带来很多麻烦 由于您将在一个事务中使用完全不同的访问模式(源表是随机的,历史表是顺序的)插入/更新多个表,所以最终会出现阻塞和/或死锁 如果无法更改现有的表架构 如果您希望有一个由数据库驱动的历史记录系统,理想情况下,您将对历史记录更新进行排队,以防止阻塞问题
- 在更新表时触发触发器
- 触发器将向队列提交一条包含插入/删除表信息的消息
- 激活存储过程可以从队列中提取信息并将其写入适当的历史记录表
- 失败时,会将新消息发送到“错误队列”,其中重试机制可以重新提交到原始队列(确保消息中包含重试计数器)
end_date
或expiration_date
,该字段设置为当前有效记录的9999/12/31
。)
当然,这种方法需要对您的数据模型和现有应用程序进行大量的代码更改,这可能不太划算。您能否提供一些有关此系统使用模式的信息。(批量/报告,oltp?)