2017-09-20 94 views
0

我有SQL Server的更新需要很長時間才能運行。代碼如下:緩慢運行更新大表

update 
    f 
    set 
    f.WorkKey = d.WorkKey, 
    f.LastModifiedDtm = GETDATE() 
    from 
    f_cic_i_agent_queue f 
    join 
    NMWork d 
    on 
    f.Workgroup = d.WorkCode 
    and 
    f.NOMDate >= d.StartDate and 
    (f.NOMDate <= d.EndDate or d.EndDate is null) 
    where 
    datediff(mm,f.NOMDate,getdate()) <= 18 

我懷疑這是最後的「或」聲明。有一個聚集的複合主鍵索引,其中包括NOMDate和Workgroup字段。

是優化此更新聲明的最佳方式嗎?

+3

問題尋求幫助的性能應包括DDL,DML的中如果您的測試數據很大,請嘗試腳本化表格的模式和統計信息(右鍵單擊數據庫 - >生成腳本 - >選擇特定數據庫對象 - >在下一個屏幕中選擇高級並選擇腳本統計信息)並粘貼它的問題。有了這個信息任何一個repro你正面臨同樣的問題。否則它變得很難回答你的問題。幫助 – TheGameiswar

+0

您需要提供執行計劃和索引信息。在此之前,您可以嘗試在where子句中避免使用DateDiff。請參閱https://stackoverflow.com/questions/2547316/is-sql-datediffyear-an-expensive-computation –

回答

0

改變你的地方statment

update 
    f 
    set 
    f.WorkKey = d.WorkKey, 
    f.LastModifiedDtm = GETDATE() 
    from 
    f_cic_i_agent_queue f 
    join 
    NMWork d 
    on 
    f.Workgroup = d.WorkCode 
    and 
    f.NOMDate >= d.StartDate and 
    (f.NOMDate <= d.EndDate or d.EndDate is null) 
    where 
    f.NOMDate>dateadd(mm,-18,getdate()) 

甚至更​​好,用一個局部變量來保存DATEADD(毫米,-18,GETDATE())