【问题标题】:Deleting / Updating / Inserting data in correct order MSSQL -> MySQL以正确的顺序删除/更新/插入数据 MSSQL -> MySQL
【发布时间】:2017-05-03 21:50:53
【问题描述】:

我目前的问题如下:

我有表A,它根据表A 上是否发生更新、插入或删除事务将项目复制到转移表,即

A -> 新插入

触发器激活并将行插入到带有另外 2 个列的 Transfer 表中 - DateQueriedQueryType(其中 DateQueried 是触发器触发的日期,QueryType 是“删除”、“插入”或“更新”取决于触发器类型)

但是,现在我需要通过链接表将这些数据传输到 Web 服务器(这一切都很好,并且应该按照应有的方式进行)。目前我有一个 PowerShell 脚本来执行此操作。该脚本执行以下操作:

  • 从我的转移表中选择所有值,通过datequeried订购
  • 运行一个 foreach 循环,该循环运行一个存储过程,以便将该值插入/更新/删除到 Web 服务器,具体取决于 QueryType 的值。

这种方法非常慢,脚本在 30 分钟计时器上运行,我们可能会在 30 分钟的时间内收到超过 100,000 行,这意味着通过 PowerShell 脚本有 100,000 个连接到数据库(尤其是当有 15 个表需要运行此过程)。

有没有更好的方法通过运行内部连接来获取这些值?以前我只会通过一个存储过程一次运行整个表,该存储过程将使用删除的QueryType 从第二个服务器中删除所有值,然后运行插入然后更新。但是,如果一个人要创建一个新作业,然后删除该作业,然后重新创建该作业,然后更新该作业,然后再次删除该作业,则会出现一些问题。我的存储过程将处理所有删除,然后处理所有插入,然后处理所有更新,因此即使该行已被删除,它也会再次将其插入。

然后我再次对其进行了重新调整,而是仅传输主键,每当我运行存储过程时,它都会根据主键处理删除,然后对于插入和更新,它会首先加入主键上的原始表(如果它先前被删除,则不会返回任何结果,因此不会插入)。但是我遇到了一个问题,查询为进程消耗了太多资源,有时会炸毁服务器(它必须尝试将 > 100,000 个结果连接到具有超过 1000 万行的表中)。还有另一个问题,它会为连接不起作用的每一列插入一个只有空值的行。然后当它再次发生时,会出现主键错误,存储过程将停止。

是否有另一个我忽略的选项可以使这里的流程更快,或者我只是坚持服务器的限制,可能不得不建议公司只在每天结束时处理上传,而不是他们想要的 30 分钟时间表?

【问题讨论】:

  • 这似乎是关于复制的问题

标签: mysql sql-server powershell


【解决方案1】:

坚持批量删除/插入/更新顺序。

但是:

  • 仅插入不存在稍后删除的行(所有 无论如何都会丢失更改)
  • 仅处理不存在后续插入或删除行的更新(所有 更改将被覆盖)

【讨论】:

  • 感谢 Nigel,因此:在 INSERT 上,我是否将其加入到自身(传输表到传输表) WHERE a.DateQueried
  • 如果您以 WHERE NOT EXISTS 的形式执行此操作,因为这将检查您想要排除的任何类型的不晚行。
猜你喜欢
  • 2014-08-27
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多