2016-04-05 6 views
4

昨日私は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つのデータベースの接続パラメータが異なることがわかります。しかし、私はそれらを見落としている...しかし、私は違いを見つけることができません。

+0

データベースの分離レベルが異なる可能性はありますか? –

+2

データベースの設定を確認してください。たぶん、読み込まれたスナップショットまたは/およびスナップショット分離レベルが有効になっていますか? – Jeffrey

+0

正直言って、あなたがやっていることはちょっとやってはいけないこと、せっかちなことではない...まずループは*厄介で、遅く、邪悪です* 。第2に、第2の接続で進捗状況を確認することは、草を引き上げてより速く成長させるようなものです.-あなたの呼び出しは、何も妨げず、物事を遅くするものです。より良いコーヒーのために行く:-) – Shnugo

答えて

0

上記の説明からわかるように、いくつかの特定のデータベースでは、カウント()の結果が正しく表示されませんでした。それはその後、ケースの場合は、代わりにあなたのカウントの下のスクリプトを使用してください(

SELECT 
COUNT(1) 
FROM Table WITH(NOLOCK) 
WHERE Column IS NULL 

は、COUNT(*)は、実行に時間がかかるため。あなたの要件はカウントを知ることです。代わりにCount(1)を使用してください。

また、トランザクションを使用している場合、データベースにロックされる可能性があります。したがって、WITH(NOLOCK)を使用して、このようなブロックを回避し、結果をより迅速に取得します。

関連する問題