我编写了一个sybase存储过程,用于将数据从主数据库上的某些表[~50]移动到给定的id到存档db。由于存档需要很长时间,因此我想与每个调用的唯一输入ID并行执行相同的存储过程。
我使用不同的输入同时手动运行存储过程两次,它似乎工作。现在我想使用Perl线程[最多4个线程],每个线程使用不同的输入执行相同的过程。
请告知这是否是推荐方式或任何其他有效方法来实现此目的。如果专家选择是线程,任何指针或示例都会有所帮助。
答案 0 :(得分:0)
你在Perl中所做的事情在这里并不重要:重要的是Sybase服务器端发生的事情。假设每个客户端任务都创建了自己与数据库的连接,那么一切正常,客户端如何实现这一点就不会给Sybase服务器带来差异。但是,不要使用不同客户端任务将尝试使用相同的客户端 - 服务器连接的模型,因为它不会并行发生。
答案 1 :(得分:0)
否'回答'本身,但一些问题/评论:
你能量化taking a very long time to archive
吗?假设您的归档过程包含insert/select
和delete
个操作,请问查询计划和MDA数据是否显示快速,高效的操作?如果您正在查看表扫描,排序合并,延迟插入/删除等等,那么可能值得努力解决所述性能问题。
你可以扩展同时运行两个存储的proc调用的注释seems to work
吗?同样,个别proc调用的性能问题的任何迹象?两个proc调用之间是否存在争用(例如阻塞)的迹象?如果没有为并行/并发操作(例如,消除阻塞)正确设计归档过程,那么通过并行运行多个过程可能不会获得太多收益。
您的数据服务器有多少引擎,您是否计划在中等到重度的用户活动期间运行存档过程?如果当前归档进程在单个dataserver引擎上以/接近100%cpu利用率运行,那么生成同一进程的4个副本可能会导致您的归档进程占用4个具有大量CPU利用率的数据服务器引擎...并且如果您的数据服务器没有&# 39; t有很多引擎......同时结合中到重的用户活动......你最终可能会引起DBA和用户的愤怒。最终结果是您可能需要确保归档过程占用数据服务器。
要考虑的另一个项目,这可能需要来自DBA的输入...如果您从任一数据库(源或存档)复制,增加每个给定时间段的事务量可能会有一个对复制吞吐量的负面影响(即复制延迟增加);如果需要将复制延迟保持在最低限度,那么您可能需要从分散事务活动的角度重新考虑整个存档过程,以免对复制延迟产生影响(例如,单线程存档过程)做一些插入/选择/删除操作,睡一会儿,然后做另一批,然后睡觉,......)。
根据我的经验,存档过程不被视为高优先级操作(假设它们定期运行,并且在源数据库填满之前);这反过来意味着归档过程通常被设计为有效,同时在数据服务器上放置(相对)轻负载(想想:在后台运行涓流)... ymmv ..