以正确的顺序删除/更新/插入数据MSSQL - > MySQL的

时间:2017-05-03 04:37:35

标签: mysql sql-server powershell

我目前的问题如下:

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

表格A - >新插入

触发器激活并将行插入到包含其他2列的转移表中DateQueriedQueryType(其中DateQueried是触发器触发的日期,QueryType是&#39 ;删除','插入'或'更新'取决于触发类型)

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

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

此方法非常慢,脚本在30分钟的计时器上运行,我们可以在30分钟的时间范围内收到超过100,000行,这意味着通过PowerShell脚本连接到DB的100,000个连接(特别是当有15个表需要运行这个过程。)

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

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

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

1 个答案:

答案 0 :(得分:1)

坚持批量删除/插入/更新订单。

可是:

  • 仅插入稍后删除的行(全部 无论如何都会失去变化)
  • 仅处理更新,其中不存在后续插入或删除行(全部 更改将被覆盖)