Я бы реорганизовал запрос, чтобы избежать перекрестного продукта, вызванного использованием нотации ,
.
Кроме того, вы эффективно используете только таблицы sector
и type
в качестве фильтров.Поэтому сначала поставьте activity
стол, а затем присоединитесь к другим вашим столам.
Некоторые могут предложить это;первое объединение в идеале должно быть объединением, которое, скорее всего, наиболее ограничит ваши результаты, оставляя минимальный объем работы для второго объединения.На самом деле, движок sql может на самом деле перестроить ваш запрос при создании плана, но он помогает мыслить таким образом, чтобы помочь вам подумать об усилиях, на которые движок sql должен пойти.
Наконец,Есть индексы на каждой таблице.Я бы на самом деле предложил поменять местами индексы ...
- ActivitySector THEN ActivityId
- ActivityType THEN ActivityId
Это именно потому, что механизм sql манипулирует вашим запросом.Он может принять предложение WHERE и сказать «включать только записи из таблицы Sector, где ActivitySector = 5», и аналогично для таблицы типов.Наличие в индексе Sector и Type идентифицирует FIRST, и эта фильтрация таблиц может быть выполнена намного быстрее, и тогда объединениям будет гораздо меньше работы.
SELECT
[activity].id
FROM
jdc_organizations_activities AS [activity]
INNER JOIN
jdc_activity_sector AS [sector]
ON [activity].id = [sector].activityId
INNER JOIN
jdc_activity_type AS [type]
ON [activity].id = [type].activityId
WHERE
[sector].activitySector = 5
AND [type].activityType = 3
Или потому, что вы нефактически использовать содержимое таблицы действий ...
SELECT
[sector].activityId
FROM
jdc_activity_sector AS [sector]
INNER JOIN
jdc_activity_type AS [type]
ON [sector].activityId = [type].activityId
WHERE
[sector].activitySector = 5
AND [type].activityType = 3
или ...
SELECT
[activity].id
FROM
jdc_organizations_activities AS [activity]
WHERE
EXISTS (SELECT * FROM jdc_activity_sector WHERE activityId = [activity].id AND activitySector = 5)
AND EXISTS (SELECT * FROM jdc_activity_type WHERE activityId = [activity].id AND activityType = 3)