【问题标题】:Perl threads to execute a sybase stored proc parallelPerl 线程并行执行 sybase 存储过程
【发布时间】:2018-03-12 12:11:47
【问题描述】:

我编写了一个 sybase 存储过程,用于将给定 id 的主 db 上的某些表 [~50] 中的数据移动到归档 db。由于归档需要很长时间,我正在考虑并行执行相同的存储过程,每次调用都有唯一的输入 ID。

我使用不同的输入同时手动运行了两次存储过程,它似乎可以工作。现在我想使用 Perl 线程[最多 4 个线程],每个线程使用不同的输入执行相同的过程。

请告知这是推荐的方式还是任何其他有效的方式来实现这一目标。如果专家的选择是线程,那么任何指针或示例都会有所帮助。

【问题讨论】:

    标签: multithreading perl sybase


    【解决方案1】:

    本身没有“答案”,但有一些问题/cmets:

    你能量化taking a very long time to archive吗?假设您的存档过程包含insert/select 和delete 操作的混合,查询计划和MDA 数据是否显示快速、高效的操作?如果您看到表扫描、排序合并、延迟插入/删除等......那么解决上述性能问题可能是值得的。

    您能否扩展一下同时运行两个存储过程调用的评论seems to work?同样,单个 proc 调用是否有任何性能问题的迹象?两个 proc 调用之间有任何争用的迹象(例如,阻塞)?如果归档 proc 的设计不适合并行/并发操作(例如,消除阻塞),那么并行运行多个 proc 可能不会获得太多收益。

    您的数据服务器有多少个引擎,您是否计划在中度到重度用户活动期间运行存档流程?如果当前存档进程在单个数据服务器引擎上以/接近 100% 的 cpu 利用率运行,则生成同一进程的 4 个副本可能会导致您的存档进程占用 4 个 CPU 利用率很高的数据服务器引擎……如果您的数据服务器没有t 有很多引擎......同时结合了中度到重度的用户活动......您最终可能会激怒您的 DBA(s)和用户。最终结果是您可能需要确保归档进程占用数据服务器。

    还有一个需要考虑的事项,这可能需要 DBA 提供输入...如果您要从任一数据库(源或存档)复制,增加每个给定时间段的事务量可能会产生负面影响关于复制吞吐量(即复制延迟的增加);如果需要将复制延迟保持在最低限度,那么您可能需要从分散事务活动的角度重新考虑整个存档过程,以免对复制延迟产生影响(例如,单线程存档过程它会执行一些插入/选择/删除操作,稍作休眠,然后再执行批处理,然后休眠,...)。


    根据我的经验,存档进程不被视为高优先级操作(假设它们定期运行,并且在源数据库填满之前);这反过来意味着归档过程通常被设计成它是高效的,同时在数据服务器上施加(相对)轻负载(想想:在后台作为涓涓细流运行)...... ymmv ...

    【讨论】:

    • 嗨,markp,请在下面找到我的答案 1) 我有吗?百万+ id 存档。根据我上次运行的数据,从 58 个表中归档 18k 个 ID 大约需要 11 个小时。正如你提到的,我正在做 insertfupdate 和删除。查询计划似乎很好,我在每个具有索引的表中使用某些列。所以这对我来说不是问题。我在事务中运行所有查询。因此过程中发生的任何错误都将回滚给定 ID 的整个事务。
    • 2) 我运行相同的 proc 两次,每次调用只有 10 个 id 作为输入。所以我不确定是否以 10K id 并行运行 proc 是否会导致任何类型的阻塞或性能问题。明天我将对此进行测试并返回。 3) 数据服务器应该有大约 20 个 enignes,但肯定不会少。是的,这个档案将在周末运行,用户活动较少。在这里运行 4 个线程也是我关心的问题。
    • 4) 在源数据库上正在设置复制,正如您提到的,必须为此收集 dba 建议。从我读到的关于线程的内容来看,如果没有仔细和正确的实施,它可能会导致与内存相关的问题。我找不到任何例子来实现我在线程中的请求。尽管它可能不起作用,但至少我想在 QA 中对其进行测试并查看其性能。任何示例代码都会有很大帮助。
    • 在 20 个引擎的数据服务器上运行 4 个并发进程应该不是问题:数据服务器资源;不确定您的记忆问题/担忧来自何处,因此无法对此发表评论;如果复制延迟成为问题,并且复制仅用于 DR,您可能希望与 DBA 合作在两个数据服务器(主服务器和复制/DR)上运行存档过程... DBA 可以授予 @987654325 @ 到您的进程,然后您需要在开始存档操作之前发出set replication off(在每个线程中)(测试以确保禁用代表)
    【解决方案2】:

    您在 Perl 中所做的事情在这里并不重要:重要的是 Sybase 服务器端发生的事情。假设每个客户端任务都创建自己的数据库连接,那么一切都很好,客户端如何实现这一点对 Sybase 服务器没有任何影响。但不要使用不同客户端任务将尝试使用相同的客户端-服务器连接的模型,因为这永远不会并行发生。

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 2013-05-14
      • 1970-01-01
      • 2014-07-03
      • 2021-10-11
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多