Может ли индекс влиять на обновление?

#sql #sql-server-2008 #tsql #indexing

#sql #sql-server-2008 #tsql #индексирование

Вопрос:

У меня есть таблица с миллионом строк. Я пытаюсь обновить определенный столбец на основе значения из другого столбца.

 update m
set repname = e.LastName   ', '   e.FirstName, 
    empNo = i.empNo,
    DateHired = e.DateHired, 
    DateTerminated = e.DateTerminated,  
    TeamCode = e.TeamCode
from 
    nyox m
inner join 
    nyerk e on m.orderSplitRepNumber = e.EmployeeNumber
inner join 
    choks i on  (m.orderSplitRepNumber) = i.full_empNo
  

Было бы быстрее, если бы я создал индекс в nyox для столбца со связью в другой таблице?

 CREATE Nonclustered INDEX ix_orderSplitRepNumber
ON nyox (orderSplitRepNumber)
  

Ответ №1:

Было бы быстрее, если бы я создал индекс в nyox для столбца со связью в другой таблице?

Это зависит от того, сколько строк не имеют совпадающих строк в связанных таблицах. Если большинство строк имеют связанные записи, оптимизатор может решить, что сканирование таблицы будет выполняться так же хорошо, поэтому индекс не будет иметь никакого значения.

Однако индексы на nyerk.EmployeeNumber и choks.full_empNo , вероятно, ускорят обновление.

Ответ №2:

тест с этим,
очевидно, что индексы в соединениях помогут
, но блокировки и set будут доминировать в этом обновлении

 select m.orderSplitRepNumber, 
       e.LastName,
       e.FirstName, 
       i.empNo,
       e.DateHired, 
       e.DateTerminated,  
       e.TeamCode
  from nyox m
  join nyerk e 
    on m.orderSplitRepNumber = e.EmployeeNumber
  join choks i 
    on m.orderSplitRepNumber = i.full_empNo
  

Есть ли шанс, что в нем уже есть значения?
Снятие блокировки записи — дорогостоящая часть.
Если вы используете предложение top, то вам нужно будет выполнить цикл, но при 1 миллионе вы можете заполнить журнал транзакций.
с помощью (nolock) необязательно и только в том случае, если вы знаете, что это безопасно

 update top (10000) m
   set m.repname = e.LastName   ', '   e.FirstName, 
       m.empNo = i.empNo,
       m.DateHired = e.DateHired, 
       m.DateTerminated = e.DateTerminated,  
       m.TeamCode = e.TeamCode
  from nyox m
  join nyerk e with (nolock)
    on m.orderSplitRepNumber = e.EmployeeNumber
  join choks i with (nolock) 
    on m.orderSplitRepNumber = i.full_empNo
 where m.repname <> e.LastName   ', '   e.FirstName, 
   and m.empNo <> i.empNo,
   and m.DateHired <> e.DateHired, 
   and m.DateTerminated <> e.DateTerminated,  
   and m.TeamCode <> e.TeamCode