【发布时间】:2016-06-25 13:59:20
【问题描述】:
我们有一个旧系统(如果您需要了解 MAS200),还有一个旧的 vbs 脚本,它从 MAS 中提取数据并在我们的生产 SQL 数据库中填充两个临时表。经过一些处理/清理后,数据会进入实际的表中。
Data flow : MAS200 --> Staging tables --> Production table
为了简化考虑,有一个“Order”父表和一个“Items”子表。订单可以有多个项目,每个项目记录都会有一个 FK OrderId。因此,在导入期间,我们首先导入订单数据并在“订单”表中创建一个条目,然后获取“项目”条目并导入它们。
现有的基于 TRIGGER 的方法 - 目前,我们有两个 TRIGGER - 每个临时表(订单和项目)上都有一个。所以每一个新的插入都会被挖掘,在处理数据之后,一个新的条目被插入到实际的生产表中。我唯一担心的是触发器是针对每个 Items 条目而不是 BULK 插入执行的。而且它似乎不太容易管理。
基于 SP 的方法 - 如果我删除两个触发器,然后将数据导入临时表,最后执行将导入订单数据的 SP,然后将 BULK 插入到 Items 表中。这会更高效/更快吗?
这不是比较,实际上只是一个差异设计。我想知道哪一个看起来更好,或者是否有第三种更好的方法可以从 MAS 导入生产 SQL 数据库。
编辑 1: 谢谢。 正如许多人所问的 - 数据量不大或过于频繁。 假设每小时有 10-12 个订单(20-30 个项目)。同样对于 TRIGGER,我们认为我们没有得到 TRANSACTION,但只有两个简单的 TRIGGER 就足够了。我相信 SP 需要更多的脚本。
目标:需要尽可能简单、干净和高效。
【问题讨论】:
-
您的临时表与生产表在同一台服务器上吗?
-
是的,staging 和 prod 表都在同一个数据库中。但是,MAS 和 vbs 脚本位于差异服务器上。此外,如果项目更多,那么我们将面临延迟。
-
如果我这样做,我会使用 SP,因为它几乎肯定会更快,并且可以让您更好地控制您的交易。根据要传输的数据量,我会选择 BULK INSERT(遵循 @elirevach 的建议)来处理大量数据,或者使用普通的 INSERT(如果某些列可能发生变化,则使用 MERGE)更适中的大小。
-
@HemantTank,忽略触发器有点冒险,但有时我们会冒风险,因为失败的可能性非常低,可能值得保持简单..
标签: database sql-server-2008 stored-procedures import database-trigger