#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