1

DBに2つのテーブルがあります。それぞれに「名前」列と「カウント」列があります。

「名前」列が等しい場合にのみ、最初のテーブルのカウントから2番目のテーブルのカウント列を更新したいと思います。

例:

最初のテーブル:

ネームカウント

ジャック 25
マイク 44

ネームカウント

ジャック 23
マイク 9
デビッド 88

結果 (2 番目のテーブルは次のようになります...)

ネームカウント

ジャック 25
マイク 44
デビッド 88

注:
1. どちらのテーブルも巨大です。(2 番目のテーブルの方が大きいですが...)
2. 更新はできるだけ速くする必要があります...
(ストアド プロシージャ以外のオプションがある場合は、ぜひ聞いてください。)
3. bigint として定義された「カウント」 while "Name" as nvarchar(100)
4. 最初のテーブルの "Count" フィールドは、常に
2 番目のテーブルの同等のフィールドよりも大きくなります。

最速の方法である限り、おそらく MERGE または TRANSACTION を使用すると、(ストアド プロシージャ以外の) もっと多くのオプションがあると思います...

ありがとう!

4

1 に答える 1

2

最善の方法は、シンプルに保つことです

UPDATE Table2
SET Count = t1.Count
FROM Table1
WHERE Table2.Name = Table1.Name 
  AND Table2.Count <> Table1.Count

テーブルのサイズが原因でこのクエリのパフォーマンスが満足のいくものでない場合、最善の解決策は名前フィールドに基づいてテーブルを分割することです。その後、パーティション関数を満たすために、名前に基づく追加のフィルターを使用して、異なるスレッドから同時にクエリを実行できます。

例: (名前が varchar(20) 列であると仮定)

UPDATE Table2
SET Count = t1.Count
FROM Table1
WHERE Table2.Name = Table1.Name 
  AND Table2.Count <> Table1.Count
  AND Table2.Name between cast('Jack' as varchar(20)) 
                      and cast('Mike' as varchar(20))

(文字列のキャストは、Sql Server がパーティションを適切に削除するのに大いに役立ちます。)

于 2011-02-17T22:22:41.787 に答える