【发布时间】:2017-05-03 21:50:53
【问题描述】:
我目前的问题如下:
我有表A,它根据表A 上是否发生更新、插入或删除事务将项目复制到转移表,即
表A -> 新插入
触发器激活并将行插入到带有另外 2 个列的 Transfer 表中 - DateQueried 和 QueryType(其中 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