Perl 线程来执行 sybase 存储的 proc 并行



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

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

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

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

本身没有"答案",但有一些问题/评论:

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

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

您的数据服务器有多少个引擎,您是否计划在中等到繁重的用户活动期间运行存档过程? 如果当前存档进程在单个数据服务器引擎上以/接近 100% 的 CPU 利用率运行,那么生成同一进程的 4 个副本可能会看到您的存档进程占用 4 个 CPU 利用率很高的数据服务器引擎......如果您的数据服务器没有很多引擎......同时结合中度到重度的用户活动......你最终可能会激起你的DBA和用户的愤怒。 最终结果是,您可能需要确保存档过程占用了数据库服务器。

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


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

最新更新