索引会影响更新吗?

时间:2014-07-02 18:45:55

标签: sql sql-server-2008 tsql indexing

我有一个包含一百万行的表。我正在尝试根据另一列的值更新特定列。

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)

2 个答案:

答案 0 :(得分:1)

  

如果我在列上的nyox上创建索引并在其他表上建立关系会更快吗?

这取决于有多少行在相关表格中有匹配的行。如果大多数行都有相关记录,优化器可能会认为表扫描也会表现一样,因此索引不会产生任何差异。

nyerk.EmployeeNumberchoks.full_empNo上的索引,但 可能会使更新更快。

答案 1 :(得分:0)

用这个测试 明确的连接索引将有助于 但锁定和设置将主导更新

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子句,那么您将需要循环,但是在100万时,您可能会填写一个事务日志 with(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