$ mg-save()在Sugarcrm的每个记录中占用太长时间

问题描述 投票:1回答:1

我有一个函数重新计算给定模块中计算字段的值。这适用于具有少量记录的小模块。但是,当我在联系人或帐户等较大的模块上尝试此操作时,保存每条记录最多需要三秒钟。

超过100,000条记录需要83小时才能处理。

这是我的代码。

$moduleList = array("Accounts", "Quotes"); 

if (!defined('sugarEntry') || !sugarEntry)
die('Not A Valid Entry Point');

require_once('include/utils.php');
require_once('include/export_utils.php');
foreach( $moduleList as $module) {
    print "Updating $module...\n<br>";
    $cnt = 0;
    $moduleBean = BeanFactory::getBean($module);
    $beanList = $moduleBean->get_full_list($order_by,$where);
    if( $beanList != null ) {
        foreach($beanList as $b) {
            // These lines prevent the modified date and user from being changed.
            $b->update_date_modified = false;
            $b->update_modified_by = false;
            $b->tracker_visibility = false;
            $b->in_workflow = true;
            $b->save();
            $cnt++;
        }
    }
    print "Finished updating: $cnt records.\n<br>";

当我记录每个记录所花费的时间时,很明显$b->save();需要的时间太长。

有什么方法可以加快速度吗?

php sugarcrm
1个回答
2
投票

首先,我建议使用您选择的工具找出保存的哪个部分需要这么长时间...探查器/调试器/自定义计时器/等。

  • 这是一个钩子吗?如果不需要重新计算,则优化它或制作自定义标志以跳过它。
  • 这是一个查询吗?分析查询(EXPLAIN)以确定向数据库添加索引是否有帮助。
  • 它的日志输出是否过多?减少它。
  • 是相关bean计算的bean加载吗?如果不需要,优化公式或跳过。

您可以尝试的其他事项:

  • 预过滤器要使用查询重新保存的bean(例如,如果在某种状态下记录重新计算不是必需的,或者在某个相关的bean之后修改它等等?)。
  • 触发更新代码中的计算字段并检查bean之后是否有实际更改的值(相关),如果没有则则不需要重新保存它,您可以跳转到下一条记录。
  • 如果这只是更新非相关的计算字段,即使存在相关的计算字段,那么您可以决定(暂时?)将$sugar_config['disable_related_calc_fields']设置为true。这样Sugar就不必加载那些相关的bean。

如果没有希望了:

  • 考虑并行运行这些任务
  • 使用SQL / SugarQuery重写您需要更新的内容(可能无法实现,具体取决于复杂性和含义)。

笔记:

  • 请注意,get_full_list()至少被弃用,因为至少Sugar 7.7并被SugarQuery和$bean->fetchFromQuery()取代。但是我建议使用Query只检索ID并使用BeanFactory::retrieveBean($module, $id)加载bean,可能在计算后逐个解除它们,使用BeanFactory::unregisterBean($bean); unset($bean);来帮助垃圾收集器保持低内存配置文件。 此外,我过去使用get_full_list()fetchFromQuery带来了灾难性的副作用,因为豆子在使用这种方式而不是BeanFactory时没有完全装满。 因此,所有记录都丢失了他们的电子邮件地址(!)。我不高兴。
  • 糖8:特别是如果你有很多联系人,那么表erased_fields上的错误的默认索引会在它有一条记录时减慢很多。 erased_fields默认只有一个2列索引(虽然不在重要的查询中使用),所以你必须为这两列添加2个单独的索引,事情会再快一些。
© www.soinside.com 2019 - 2024. All rights reserved.