У меня есть следующие таблицы:
-
work_units
- самоочевидный -
workers
- самоочевидный -
skills
- для каждой рабочей единицы требуется определенное количество навыков, если вы хотите работать над ней. Каждый работник обладает навыками. -
work_units_skills
- присоединиться к таблице -
workers_skills
- присоединиться к таблице
Работник может запросить следующую подходящую для него высшую приоритетную (независимо от того, что это означает) единицу работы.
В настоящее время у меня есть:
SELECT work_units.*
FROM work_units
-- some joins
WHERE NOT EXISTS (
SELECT skill_id
FROM work_units_skills
WHERE work_unit_id = work_units.id
EXCEPT
SELECT skill_id
FROM workers_skills
WHERE worker_id = 1 -- the worker id that made the request
)
-- AND a bunch of other conditions
-- ORDER BY something complex
LIMIT 1
FOR UPDATE SKIP LOCKED;
Это условие делает запрос в 8-10 раз медленнее, хотя.
Есть ли лучший способ выразить, что навыки work_units
должны быть подмножеством навыков workers
или что-то для улучшения текущего запроса?
Еще один контекст:
- Таблица
skills
довольно мала. - Оба
work_units
иworkers
имеют тенденцию иметь очень мало связанных навыков. -
work_units_skills
имеет индекс наwork_unit_id
. - Я попытался переместить запрос на
workers_skills
в CTE. Это дало небольшое улучшение (10-15%), но оно все еще слишком медленно. - Рабочее устройство без навыков может быть поднято любым пользователем. Aka пустой набор является подмножеством каждого множества.