Sql server 历史机制的最佳性能方法?

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:使用链接的服务器,该服务器存储将包含历史记录表的数据库 问

我们将通过触发器为DB中的更改创建历史机制(图中的DART

我们有600张桌子

每个将被更改的记录-触发器将把删除的记录插入到XXX


关于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数据库的备份时间-这可能是一个问题

一般来说,我认为如果你的应用领域需要“历史”的概念,你应该把它作为一个一流的特性来构建。有几种方法可以做到这一点-查看有问题的链接


同样,总的来说,我不喜欢为这种需求使用触发器。您的触发器必须非常简单(在这种情况下,使用它在历史记录表中创建的数据并不总是那么容易),或者必须是智能的,在这种情况下,您的触发器需要做大量工作,这可能会使您的数据库模式在未来的发展中变得更加困难

这三种方法都是可行的,并且根据您的网络速度具有相似的性能,但是在有许多并发用户的系统上,每种方法都会给您带来很多麻烦

由于您将在一个事务中使用完全不同的访问模式(源表是随机的,历史表是顺序的)插入/更新多个表,所以最终会出现阻塞和/或死锁

如果无法更改现有的表架构 如果您希望有一个由数据库驱动的历史记录系统,理想情况下,您将对历史记录更新进行排队,以防止阻塞问题

  • 在更新表时触发触发器
  • 触发器将向队列提交一条包含插入/删除表信息的消息
  • 激活存储过程可以从队列中提取信息并将其写入适当的历史记录表
  • 失败时,会将新消息发送到“错误队列”,其中重试机制可以重新提交到原始队列(确保消息中包含重试计数器)
这样,您的历史记录更新将是非阻塞的,并且不会丢失

注意:使用SQLServerServiceBroker时,请确保完全理解“有害消息”的概念

如果可以更改现有的表架构 如果这是一个选项,我建议使用“记录版本控制”系统,在该系统中,每次更新都将创建一个新记录&您的应用程序将正确查询数据的最新版本。为了确保适当的性能,可以对表进行分区,以将数据的最新版本保留在分区中,将旧版本保留在存档分区中。(我通常有一个字段
end_date
expiration_date
,该字段设置为当前有效记录的
9999/12/31
。)


当然,这种方法需要对您的数据模型和现有应用程序进行大量的代码更改,这可能不太划算。

您能否提供一些有关此系统使用模式的信息。(批量/报告,oltp?)