$ bean-save () занимает слишком много времени на запись в Sugarcrm - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть функция, которая пересчитывает значение вычисляемых полей в заданных модулях.Это прекрасно работает для небольших модулей с небольшим количеством записей.Однако, когда я пытаюсь сделать это на больших модулях, таких как Контакты или Учетные записи, сохранение каждой записи занимает до трех секунд.

С более чем 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(); - это то, что занимает слишком много времени.

Есть ли способ ускорить это?

1 Ответ

0 голосов
/ 17 ноября 2018

Прежде всего, я бы порекомендовал выяснить, какая часть сохранения занимает столько времени, используя инструмент по вашему выбору ... профилировщик / отладчик / пользовательские таймеры / и т. Д.

  • Это так?крючок?Оптимизируйте его или сделайте собственный флаг, чтобы пропустить его, если он не нужен для повторного вызова.
  • Это запрос?Проанализируйте запросы (EXPLAIN), чтобы выяснить, может ли помочь добавление индексов в базу данных.
  • Это чрезмерный вывод журнала?Уменьшите его.
  • Это загрузка бинов для расчета связанных бинов?Оптимизируйте формулы или пропустите, если не нужно.

Другие вещи, которые вы можете попробовать:

  • Предварительный фильтр, бины которого вы хотите восстановить, используя Запрос (например, может быть, запись записи не нужна, еслив определенном состоянии или изменен после определенного связанного компонента и т. д.?).
  • Запустить обновление вычисленных полей в вашем коде и проверить, изменились ли (уместные) значения компонента, где фактически изменились после, если нет, то нет необходимости восстанавливатьвместо этого вы можете перейти к следующей записи.
  • Если речь идет только об обновлении несвязанных вычисляемых полей, даже если существуют связанные вычисляемые поля, тогда вы можете решить (временно?) установить $sugar_config['disable_related_calc_fields'] в значение true,Таким образом, Sugar не нужно будет загружать эти связанные bean-компоненты.

Если надежды не осталось:

  • Рассмотрим параллельное выполнение этих задач
  • Перепишите все, что вам нужно обновить, используя SQL / SugarQuery (может быть невозможно, в зависимости от сложности и последствий).

Примечания:

  • Beпомните, что get_full_list() устарело, поскольку, по крайней мере, Sugar 7.7 и заменено на SugarQuery и $bean->fetchFromQuery().Однако я бы порекомендовал использовать Query только для получения ID s и использовать BeanFactory::retrieveBean($module, $id) для загрузки bean-компонентов, возможно, отключая их каждый раз после вычисления, используя BeanFactory::unregisterBean($bean); unset($bean);, чтобы помочь сборщику мусора поддерживать низкий уровень.профиль памяти.
    Также в прошлом я использовал get_full_list() и fetchFromQuery с катастрофическими побочными эффектами из-за неполной загрузки бинов при использовании этого способа вместо BeanFactory.
    Все записи потеряли свои адреса электронной почты(!) в следствии.Мне это не понравилось.
  • Сахар 8: Особенно, если у вас много контактов, плохие индексы по умолчанию в таблице erased_fields сильно замедляют работу, как только в ней есть одна запись.erased_fields по умолчанию имеет только 2-колоночный индекс (который не используется в важных запросах), поэтому вам придется добавить 2 отдельных индекса для этих 2-х столбцов, и все будет лот быстрее снова.
...