2017-09-20 7 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 

最後の "or"ステートメントと思われます。 NOMDateフィールドとWorkgroupフィールドを含むクラスタ化された複合主キーインデックスがあります。

この更新ステートメントを最適化する最適な方法はありますか?

+3

質問はDDLのDMLを含むべきですあなたのテストデータが大きい場合は、テーブルのスキーマと統計をスクリプト化してください(データベースを右クリック - >スクリプト生成 - >特定のデータベースオブジェクトを選択 - >次の画面で詳細を選択して統計を選択してください)質問に貼り付けてください。この情報では、あなたが直面している問題と同じ問題が発生します。それ以外は、あなたの質問に答えるのが非常に難しくなります。 help – TheGameiswar

+0

実行計画とインデックス情報を提供する必要があります。その前に、Where句でDateDiffを避けることができます。 https://stackoverflow.com/questions/2547316/is-sql-datediffyear-an-expensive-computationを参照してください。 –

答えて

0

変更あなたなステートメントは

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保持するために地元のVARを使用します。ここで、(ミリメートル、-18、GETDATE())パフォーマンスの助けを求めている

関連する問題