【问题标题】:Optimize slow update query优化慢更新查询
【发布时间】:2015-11-08 02:16:36
【问题描述】:

我有两张桌子:

1) Testone - 有 100k 行和 1 个索引和 6 个非聚集索引

2) Testtwo - 有 3.16 亿行,1 个索引和 4 个非聚集索引

由于执行此查询需要更多时间,我有更新语句需要优化以下语句,请您帮助我最好的方法..

update mp 
set mp.ModelInfoID = mi.ModelInfoID 
from Testone mp 
inner join Testtwo mi on mp.ModelNumberStr = replace(replace(mi.Model, '/', ''), '-', '') 
where MemberID is not null and mp.ModelInfoID is null

【问题讨论】:

  • 使用替换(或任何其他)功能的连接将执行得非常糟糕!您需要在一个通用的索引列上连接您的表。如果没有,那么您的查询将永远不会在数百万行中表现良好。
  • 也许添加 computed column 到 testtwo 而不是内联 replace(replace。计算的列然后可以用于产生 SARgable 结果的索引

标签: sql sql-server sql-server-2008 sql-update


【解决方案1】:

从优化这个开始
查看查询计划
MemberID、mp.ModelInfoID 和 mi.ModelInfoID 的索引会有所帮助

select mp.ModelInfoID, mi.ModelInfoID 
  from Testone mp 
  join Testtwo mi 
    on mp.ModelNumberStr = replace(replace(mi.Model, '/', ''), '-', '') 
   and MemberID is not null 
   and mp.ModelInfoID is null
   and mi.ModelInfoID is not null -- no need to update if they are the same

清除 replace(replace(mi.Model, '/', ''), '-', '') 将成为瓶颈。带有索引的计算列可能会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2021-07-10
    • 2022-01-24
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多