【问题标题】:Data import via Stored procedure or Triggers通过存储过程或触发器导入数据
【发布时间】: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


【解决方案1】:

使用触发器:

  • 优点: 数据同步是实时的。当您通过数据输入创建数据时,数据量不应该很大,因此批量插入并没有太大改善。使用触发器的性能已经足够好
  • 缺点: 数据同步不是实时的,如果 MAS200 和生产之间的连接中断,您将遇到大问题。另外(正如您提到的)您不能进行交易,这是一个大问题。

我建议您使用 SP 以时间间隔传输数据(如果您可以容忍同步延迟)。

【讨论】:

  • 好点。添加我的 2 美分 - TRIGGER 也无法使用 TRANSACTION 方法。仅供参考,数据量是 - 一个订单最多可以有 30-40 个项目。那你说呢?
  • 关于交易的好点。你每分钟有多少订单?您可以在 10 秒内轻松传输数十万条记录。所以我认为你在性能方面不会有任何问题。您将能够轻松地每分钟同步一次,而不会影响服务器性能。
  • 我已修改 - 请参阅编辑 1 并让我知道您的想法。我不想让它有偏见。
【解决方案2】:

如果你真的想要快速的方法,你需要:

1) 在加载期间禁用 ITEMS 表上的 FK

2) 然后加载 ORDERS ,然后启用 FK

所有这些都应该使用 SP 来完成,触发方法是安全的,但在大批量加载时非常慢

希望对你有用

谢谢

【讨论】:

  • 这是一个持续的设置,订单将被频繁导入 - 打开和关闭 FK 不是一个选项。我已经修改 - 请参阅编辑 1。谢谢
  • 很多时候我们会看到在站点、应用程序和数据库上都强制执行 FK 的情况,如果您可以确保您的应用程序已经验证了此 FK(选择以在插入数据之前检查父项是否存在给孩子),很多时候你可以禁用它,它会提高你的性能并简化你的解决方案
  • 知道了,但是我们需要在 DB 中持久化 FK。
猜你喜欢
  • 2018-01-18
  • 2014-06-16
  • 1970-01-01
  • 2010-12-09
  • 2023-04-02
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多