1

あるテーブル レコードを別のテーブル レコードに基づいて更新する必要があります。

私は試した

update      currencies
set         priority_order= t2.priority_order
from        currencies t1
inner join  currencies1 t2
on          t1.id = t2.id

エラーが発生しています(MySQLとSQL Serverで同じクエリが機能します)。

次に、以下を試しました:

update      currencies
set         priority_order= (select 
                            priority_order 
                            from currencies1 
                            where 
                            currencies.id=currencies1.id
                           )

それは機能していますが、非常に遅いです。いくつかの大きなテーブルでも行う必要があります。

何か案は?

4

2 に答える 2

2
UPDATE currencies dst
   SET priority_order = src.priority_order
  FROM currencies src
 WHERE dst.id = src.id
   -- Suppress updates if the value does not actually change
   -- This will avoid creation of row-versions
   -- which will need to be cleaned up afterwards, by (auto)vacuum.
AND  dst.priority_order IS DISTINCT FROM src.priority_order
        ;

更新のソースとターゲットの両方に同じテーブルを使用して、テスト (10K 行、キャッシュ ウォームアップ後):

CREATE TABLE
INSERT 0 10000
VACUUM
Timing is on.
cache warming:
UPDATE 0
Time: 16,410 ms
zero-rows-touched:
UPDATE 0
Time: 8,520 ms
all-rows-touched:
UPDATE 10000
Time: 84,375 ms

通常、行がまったく影響を受けないケースも、すべての行が影響を受けるケースもめったに見られません。しかし、タッチされた行が 50% しかない場合でも、クエリは 2 倍高速になります。(さらに、クエリのバキューム作業の削減)

于 2015-07-08T17:23:08.137 に答える