Разница между запросом на обновление с выбранным подзапросом и запросом с внутренним объединением - PullRequest
0 голосов
/ 01 декабря 2019

Может кто-нибудь подсказать, пожалуйста, разницу между выполнением ниже двух запросов.

Update SomeTable 
Set Field1= 1234
Where Field2 in (Select Field_2 from SomeOthertable where x= 1)

Vs

Update Sometable as ST
Inner join SomeOthertable as SOT
On ST.Field2 = SOT.Field_2 and SOT.X = 1
Set ST.Field1 = 1234

1 Ответ

1 голос
/ 01 декабря 2019

Чтобы понять разницу в исполнении, вам нужно взглянуть на планы выполнения.

Вот некоторые рекомендации:

  • В общем, 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 гарантирует, что соответствующие строки обновляются только один раз.

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