Чтобы понять разницу в исполнении, вам нужно взглянуть на планы выполнения.
Вот некоторые рекомендации:
- В общем,
JOIN
идетбыть быстрее, чем IN
, потому что есть больше возможностей для оптимизации и IN
удаляет дубликаты. - В случае
UPDATE
любые дубликаты могут вызвать проблемы с производительностью, потому чтоодна и та же строка может обновляться несколько раз. Это не повлияет на результаты, поскольку значение поля не изменяется.
Часто exists
имеет хорошие характеристики производительности:
Update SomeTable st
Set st.Field1 = 1234
Where exists (Select 1
from SomeOthertable sot
where sot.Field_2 = st.Field2 and sot.x = 1
);
В частности, это может быть использованоиндекса на SomeOthertable(field2, x)
. JOIN
также может использовать этот индекс, но EXISTS
гарантирует, что соответствующие строки обновляются только один раз.