ない。PostgreSQLでは、代わりに次のようにします。
WITH x AS (
SELECT unnest('{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60
,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
}'::int[]) AS id
)
UPDATE mytable t
SET myflag = 1
FROM x
WHERE t.id = x.id;
10000 個の ID が多いという視覚的な手がかりを与えるために、例に非常に多くの ID を入れました。質問で提示された 2 つのアイデアは、次のいずれかになります。
リストを解析し、10000 個のステートメントをまとめてサーバーに送信する必要があります。これには、UPDATE 自体よりも時間がかかる可能性があります。
一致する ID を求めて、id
各個人の 10000 項目のリスト (配列) を検索する必要があります。mytable
標準インデックスは使用できません。これは非常に遅くなります。のサイズでパフォーマンスが低下しmytable
ます。
上のインデックスmytable.id
は、両方のバリアントを桁違いに上回るために提示されたすべての代替ニーズです。
CTEは配列を 1 回解析します(サブクエリも機能します - MySQL には CTE がありません) unnest()
。1 つのステートメントですべてを実行すると、10000 ステートメントよりも桁違いに優れています。これらのステートメントが個々のトランザクションで実行される場合は、さらに桁違いに追加します。個別のセッションを使用する必要がある場合は、別のセッションを追加してください。
書き込み負荷が高い場合にロックの問題が発生するデータベースには、まれな例外が適用されます。アドバイスされているようにベンチマークするだけです。EXPLAIN ANALYZE
は PostgreSQL の友達です。
操作が巨大になり、ほとんどのテーブルが更新された場合、および/またはディスク容量または RAM が不足している場合でも、操作をいくつかの論理チャンクに分割することをお勧めします。スポット。ほとんどの場合、HOT 更新UPDATE
で以前の実行からのテーブルの肥大化をリサイクルできるようにします。この関連する質問を検討してください。