2017-12-29 53 views
0

私たちには巨大なDMLスクリプトがあります。これはトランザクションを開き、多くの変更を行い、それがコミットするだけです。SQL ServerのROLLBACKトランザクションは永遠に完了しました。どうして?

最近、私はこのスクリプトを(アプリケーション経由で)起動させていました。かなり時間がかかっていたので、セッションを終了してROLLBACKを起動しました。

これはROLLBACKが永久に奪取され、さらに多くのCPU(100%の稼働率)を使用していたことが問題です。このセッション(exec DMVを使用)を監視していたとき、IO関連(IO_COMPLETION、PAGE_IO_LATCHなど)。

私の質問は です。1.ロールバックには時間がかかりますか?すべての復帰変更をLOGファイルに書き込む必要があるからですか?そしてIOがこのLOGファイルに対するIO操作に関連しているのを待っていますか? 2. ROLLBACKメカニズムの仕組みを説明するオンラインリソースがありますか?

はSOのDBA側の別の記事に基づいてあなたに

+0

ここをクリックhttps://stackoverflow.com/questions/2305277 – devio

+0

なぜそれを行うには多くの時間をかける場合、それは同じものを元に戻すには多くの時間がかからないと思うのですか?また、ロック/デッドロックによってトランザクションを保持することもできます。 – jean

+0

@jeanあなたのご意見は分かりません。 Devio、リンクをありがとう。 – naz

答えて

0

ありがとう、ROLLBACKが少なくとも2つの理由のために遅いです:オリジナルのSQLは、ロールバックはシングルスレッドであり、マルチスレッドされることが可能であり、2つ、コミットはすでに完了している作業を確認します。ロールバックでは、元に戻すログアクションを特定するだけでなく、影響を受ける行をターゲットにする必要があります。

https://dba.stackexchange.com/questions/5233/is-rollback-a-fast-operation

+0

ありがとう、マイク。これは私の質問の一部に答えます。私は、ROLLBACKがIO集中型である理由にほとんど関心がありました。私の答えには理由があります。 – naz

0

これは、私は、SQL ServerのROLLBACK操作は、時間がかかるかもしれない理由について、それはIOの多くを作り出すことができる理由を見出したものです。 オープントランザクションの一部としてDBへの変更が多く書き込まれている場合、これらの変更により、メモリ内のデータページ(ダーティページ)とログレコードが変更されます。生成されたLOG BLOCKSという構造体)が最初にバッファー・プールに書き込まれます(メモリー内)。これらのダーティ・ページは、定期的なチェックポイント操作またはレイジー・ライト処理のいずれかによってディスクにフラッシュされます。 SQL Serverの先行書き込みロギングメカニズムに従って、ダーティページがフラッシュされる前に、これらの変更を記述するLOG RECORDSもディスクにフラッシュする必要があります。

このバックグラウンドの知識を念頭に置いて、トランザクションがロールバックされると、これはほとんどの場合、ディスクに書き込まれたすべての変更を元に戻す必要がある回復操作に似ています。したがって、取り返しのつかない多くのデータ変更があったため、私たちが経験していた大量のIOが発生した可能性があります。

情報ソース:https://app.pluralsight.com/library/courses/sqlserver-logging/table-of-contents このコースでは、SQL Serverでログの回復がどのように機能するかについて詳しく説明します。

関連する問題