Повысить производительность соединения «один ко многим» - PullRequest
0 голосов
/ 08 июня 2018

Мы строим модель, в которой мы объединяем профиль из 13 частей (01_01_resource_utilization_prepared) с ежедневной записью, чтобы создать 13 записей в день;это преднамеренный один-ко-многим, который увеличивает размер таблицы.

Это простой запрос, но мы пробовали индексирование, но как лучше оптимизировать этот запрос?

SELECT
a.DATE,
a.RUN_ID,
a.HOURS,
a.HOURS * b.RESOURCE_DISTRIBUTION,
a.SCHEDULE_PROFILE_ID,
a.WEEKDAY_NUMBER,
a.SCHEDULE_DISTRIBUTION,
b.RESOURCE_DISTRIBUTION,
a.LOCATION_DESC,
a.DEPARTMENT_DESC,
a.LANGUAGE_DESC,
a.JOB_TITLE_DESC,

FROM
03_01_schedule a
LEFT JOIN 01_01_resource_utilization_prepared b ON (
    a.RESOURCE_PROFILE_ID = b.RESOURCE_PROFILE_ID
    AND a.DATE >= b.EFFECTIVE_FROM
    AND a.DATE <= b.EFFECTIVE_TO
)

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Относится ли 01_01 к 01 января?Если так, я полагаю, что это плохой способ выложить данные.Но между тем ...

Проверка в пределах диапазона, где диапазон происходит из другой таблицы, трудно оптимизировать.Эти составные индексы на b немного помогут:

INDEX(RESOURCE_PROFILE_ID, EFFECTIVE_FROM)
INDEX(RESOURCE_PROFILE_ID, EFFECTIVE_TO)

Нужен ли LEFT?Если его можно удалить, не разрушив семантику, тогда гораздо лучше.Удаление LEFT сделает это полезным для a:

INDEX(RESOURCE_PROFILE_ID, `DATE`)

(Между тем, я не понимаю значимости всего, что вы сказали в первом абзаце.)

0 голосов
/ 08 июня 2018

Без дополнительной информации я не могу сказать точно, но производительность будет зависеть от индексации столбцов, которые вы сравниваете.Без индексов объединение может сканировать каждую строку, «полное сканирование таблицы» .

В MySQL довольно часто забывают объявлять внешние ключи .03_01_schedule.RESOURCE_PROFILE_ID и 01_01_resource_utilization_prepared.RESOURCE_PROFILE_ID должны быть объявлены как внешние ключи, и они будут проиндексированы.Это значительно ускорит базовое соединение и обеспечит ссылочную целостность.

03_01_schedule.DATE, 01_01_resource_utilization_prepared.EFFECTIVE_FROM и 01_01_resource_utilization_prepared.EFFECTIVE_TO должны быть проиндексированы.Это сделает сравнение с использованием этих столбцов намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...