Автор Тема: блокирующий select executeS  (Прочитано 359 раз)

12 Май 2019, 12:51:49
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля

session_write_close();
       
        try {
            $results = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
                (new DbQuery())
                    ->select('ps.`id_product`, ps.`id_shop`, pl.`id_lang`, ps.`date_upd` AS `product_updated`')
                    ->select('eis.`date_upd` AS `product_indexed`')
                    ->from(bqSQL(Product::$definition['table']).'_shop', 'ps')
                    ->leftJoin(
                        bqSQL(Product::$definition['table']).'_lang',
                        'pl',
                        'pl.`id_product` = ps.`id_product`'.($idLang ? ' AND pl.`id_lang` = '.(int) $idLang : '')
                    )
                    ->leftJoin(
                        bqSQL(IndexStatus::$definition['table']),
                        'eis',
                        'ps.`id_product` = eis.`id_product` AND ps.`id_shop` = eis.`id_shop` AND eis.`id_lang` = pl.`id_lang`'
                    )
                    ->join(!$idLang ? 'INNER JOIN `'._DB_PREFIX_.'lang` l ON pl.`id_lang` = l.`id_lang` AND l.`active` = 1' : '')
                    ->where($idShop ? 'ps.`id_shop` = '.(int) $idShop : '')
                    ->where('ps.`date_upd` != eis.`date_upd` OR eis.`date_upd` IS NULL')
                    ->groupBy('ps.`id_product`, ps.`id_shop`, pl.`id_lang`')
                    ->limit($limit, $offset)
            );
        } catch (\PrestaShopException $e) {
            \Logger::addLog("Elasticsearch module error: {$e->getMessage()}");

            $results = false;
        }


вызываю этот код из двух разных браузеров
второй вызов выполняется дольше чем первый
такое ощущение что первый запрос делает блокировку, и второй запущенный скрипт ждет окончания работы
как сделать чтобы одновременно выполнялся код?
13 Май 2019, 10:34:13
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
$sql = 'SELECT...';
return Db::getInstance()->ExecuteS($sql);
Выполняется в два раза быстрее.
13 Май 2019, 14:24:10
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
предлагаете убрать _PS_USE_SQL_SLAVE_ и DbQuery?
и переписать запрос на чистом sql  и сравнить время выполнения?
13 Май 2019, 16:04:29
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
предлагаете убрать _PS_USE_SQL_SLAVE_ и DbQuery?
и переписать запрос на чистом sql  и сравнить время выполнения?
Да
13 Май 2019, 16:06:03
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
заменил DbQuery на sql строкой но разницу не заметил
по сути DbQuery это просто генератор строки запроса https://devdocs.prestashop.com/1.7/development/database/dbquery/
13 Май 2019, 16:18:55
Ответ #5
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
может база блокирует? но тогда бы росло время выполнения кода
я засекал время через timestamp, у всех вкладок значение примерно одинаковое
а хром консоль показывает разное время 5с,10с,15,20с
на каждой вкладке идет рост время ожидания
13 Май 2019, 21:03:39
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
так может это с кешированием проблема?
13 Май 2019, 22:01:34
Ответ #7
  • Фрилансер
  • *
  • Сообщений: 185
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
SMARTY - APPLICATION CACHE вкл
SERVER SIDE CACHING выкл
что еще проверить?