Как найти метод с медленным запросом к БД и как сократить время выполнения?

Здравствуйте.

При мониторенге производительности быил выявлены медленые запросы к БД и из них большенство хитов это картинки.
5ed8aa44da370081574467.png

1. Как найти какой именно метод так нагружает БД?

Приведу сам проблемный запрос:
SELECT
   COUNT(DISTINCT
         BE.ID) as C
FROM
   b_iblock B
   INNER JOIN b_lang L ON
      B.LID = L.LID
   INNER JOIN b_iblock_element BE ON
      BE.IBLOCK_ID = B.ID
WHERE 1 = 1
   AND ((
         EXISTS (
            SELECT
               IBLOCK_ID
            FROM
               b_iblock_site
            WHERE
               IBLOCK_ID = B.ID
               AND (SITE_ID = 's1') ) )
      AND ( (
            BE.ACTIVE_TO >= now()
            OR BE.ACTIVE_TO IS NULL )
         AND (BE.ACTIVE_FROM <= now()
            OR BE.ACTIVE_FROM IS NULL ) )
   AND (BE.ACTIVE = 'Y')
      AND (BE.IBLOCK_ID = '2'))
   AND (BE.WF_STATUS_ID = 1
      AND BE.WF_PARENT_ELEMENT_ID IS NULL )
   AND ( B.ID IN (
         SELECT IBLOCK_ID
         FROM b_iblock_group IBG
         WHERE IBG.GROUP_ID IN (2)
            AND IBG.PERMISSION >= 'R'
            AND (
               IBG.PERMISSION = 'X'
               OR B.ACTIVE = 'Y'
            ))
      OR (
         B.RIGHTS_MODE = 'E'
         AND EXISTS (
            SELECT
               ER.ELEMENT_ID
            FROM
               b_iblock_element_right ER
               INNER JOIN b_iblock_right IBR ON
                  IBR.ID = ER.RIGHT_ID
               INNER JOIN b_user_access UA ON
                  UA.ACCESS_CODE = IBR.GROUP_CODE
                  AND UA.USER_ID = 0
            WHERE
               ER.ELEMENT_ID = BE.ID
               AND IBR.OP_EREAD = 'Y'
         ) ))

Тут много вложенных уловий, как можно это сократить?
  • Вопрос задан
  • 343 просмотра
Решения вопроса 1
smilingcheater
@smilingcheater
У вас эти картинки реально на файловой есть? Выглядит так, будто картинки нет, вместо неё возвращается 404, которая отдаётся битриксом. Я бы предложил открыть в браузере 404, включить битриксовую отладку (панель эрмитажа, развернуть, кнопка "Отладка") и в выведенной отладочной информации искать виновника.

На вашем скрине в статистике время выполнения запросов порядка 0.25-0.35 сек, но время выполнения всей страницы доходит до 4-5 сек. Выглядит так, будто какой-то тяжёлый компонент на 404 работает с выключенным кешированием.

А ещё лучше - настроить, чтобы картинки отдавал NGINX, и 404 на картинки тоже он.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
Хреновый запрос, однако. Мои мысли по поводу улучшений:
COUNT DISTINCT => COUNT(*), GROUP BY
EXISTS => LEFT JOIN
IN (SELECT ...) => INNER JOIN

Не гарантирую, что прав 100%.
А, вообще, такие запросы следует дробить. Такие сложные запросы - это признак плохого проектирования. Лучше воспользоваться дополнительными таблицами для хранения состояний.
Шаблон материализованного представления
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы