昨日私はSQLサーバー管理スタジオから複数のデータベースにパッチを適用すると、この奇妙な(以前は見たことがない)状況が発生しました。私はいくつかのデータベース上で大きなテーブル(5百万レコード+)を更新する必要がありました。データベースごとに発行した文は、次のようなものでした:SQLサーバーは即座に結果を返します
set rowcount 100000
select 1
while @@rowcount > 1
update table
set column = newval
where column is null
これらの文は数秒間(2〜30秒の間)実行されました。 2番目のタブでは、次のクエリを実行しました:
select count(*)
from table
where column is null
すでに処理されている行の数を確認するだけです。私のように辛抱強く、私はカウント(*)ステートメントのためにF5を20秒ごとに押しました。そして期待された振る舞いは、カウント(*)が計算されるまで0から30秒の範囲のものを待たなければならないということでした。私はこの動作を期待していました。更新ステートメントが実行されていたので、カウント(*)が次の行になっていました。
しかし、データベースまたは10の後、この奇妙なことが起こった。私は次のデータベースをオープンし(USE経由でデータベースを変更しました)、F5を押すとすぐにカウント(*)が応答しました。 F5をもう一度押すと、結果は表示されますが、何も進まずに何度も何度も何度も何度も何も変わらなかったのです。しかし、更新は実行されていました。
そして、n番目のプレスの後、ちょうど100Kレコードでカウント(*)が落ちました。私はF5をもう一度押すとすぐに結果が得られました。 (*)を待っていませんでした...私は汚いまたは....を読み取ることができませんでした。
このデータベースのみが私にこの動作を与えました。そして、私は本当にこれを引き起こしている何か手がかりがありません。
データベースの切り替え中に他のタブを閉じたり開いたりしていないので、その1つのデータベースの接続パラメータが異なることがわかります。しかし、私はそれらを見落としている...しかし、私は違いを見つけることができません。
データベースの分離レベルが異なる可能性はありますか? –
データベースの設定を確認してください。たぶん、読み込まれたスナップショットまたは/およびスナップショット分離レベルが有効になっていますか? – Jeffrey
正直言って、あなたがやっていることはちょっとやってはいけないこと、せっかちなことではない...まずループは*厄介で、遅く、邪悪です* 。第2に、第2の接続で進捗状況を確認することは、草を引き上げてより速く成長させるようなものです.-あなたの呼び出しは、何も妨げず、物事を遅くするものです。より良いコーヒーのために行く:-) – Shnugo