none
UPDATEの大量データからの更新が遅延して行われる RRS feed

  • 質問

  • 約260万行のデータに5000行ほどの更新(ストアドの最後に終了をメッセージを表示)かけました。

    終了結果が返った後、何行かの行は更新が遅れては発行されます。

    マネージャーで更新該当行を確認すると、実行直後は更新されていませんが、数分立つと更新されています。

    勿論、印刷されて帳票も直後は更新前の値で、数分たつと更新された値になります。

    何か設定があるのでしょうか?

    100万行以下のテーブルでは発生していないようです。

    同様の自体が発生された方、解決策をお持ちの肩、ご教授お願いします。m(_ _)m

    バージョンは以下です

    Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64)   Apr 29 2016 23:23:58   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: )
    • 編集済み PETENSs 2019年11月25日 1:23 バージョン情報追加
    2019年11月25日 1:18

回答

  • 「トランザクションの持続性の制御」
    https://docs.microsoft.com/ja-jp/sql/relational-databases/logs/control-transaction-durability?view=sql-server-ver15

    SQL Server にはコミットを遅延させることで性能向上を図るオプション(delayed_durability)があるようですが・・・

    コミットしていないだけ、というオチでは?

    • 回答としてマーク PETENSs 2019年11月29日 15:01
    2019年11月26日 5:00
  • PETENSsさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    この問題はトランザクションロックに関連している可能性があると思います。 
    トランザクションのロックおよび行のバージョン管理ガイドを確認してください。ロックについて明確に説明します。 
    さらに、行ロックまたはテーブルロックを使用して、ダーティリードを防止できます。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク PETENSs 2019年11月29日 14:59
    2019年11月28日 8:59
    モデレータ

すべての返信

  • 「トランザクションの持続性の制御」
    https://docs.microsoft.com/ja-jp/sql/relational-databases/logs/control-transaction-durability?view=sql-server-ver15

    SQL Server にはコミットを遅延させることで性能向上を図るオプション(delayed_durability)があるようですが・・・

    コミットしていないだけ、というオチでは?

    • 回答としてマーク PETENSs 2019年11月29日 15:01
    2019年11月26日 5:00
  • PETENSsさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    この問題はトランザクションロックに関連している可能性があると思います。 
    トランザクションのロックおよび行のバージョン管理ガイドを確認してください。ロックについて明確に説明します。 
    さらに、行ロックまたはテーブルロックを使用して、ダーティリードを防止できます。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク PETENSs 2019年11月29日 14:59
    2019年11月28日 8:59
    モデレータ
  • 情報有難うございます。

    トランザクション上は問題なく行われています。別セッションでのread時にトランザクションの内容が反映されずに、前のレコード内容が読み取られてしまっているように見えます。

    大量のトランザクションの問題で、発生したトランザクションの反映が遅延し、READ時に発生したトランザクションが考慮されない状態で、読みとられてしまっている可能性はあると思います。トランザクションロックのSQL SERVER内部処理を分析していませんので、教えて頂いた資料を参考にさせていただきます。

    有難うございます。




    • 編集済み PETENSs 2019年11月30日 1:50 誤字訂正
    2019年11月29日 14:27
  • 確認しました。

    なるほど、この状況はSQl SERVERでは発生するのですね。

    回避策も書かれていました。取り合えず、書かれていトランザクションログの強制フラッシュをストアドに書き込みました。

    sys.sp_flush_log

    しばらく様子を見ようと思います。有難うございました。

    2019年11月29日 14:53
  • ご回答遅くなりました。

    Commit自体は実行しております。

    Roll Backと対で実行しますので、必然的に実行しております。

    また、delayed_durability件の情報有難うございます。

    確認して見ます。

    2019年11月29日 14:55