本番環境でパフォーマンスの問題が発生した後、データベース管理者に支援を求めました。手伝いをしているときに、マージするとテーブルがロックされることを知らされ、代わりに UPDATE ステートメントを使用するよう提案されました。
私が読んだすべてのことから、MERGE INTO と UPDATE には同様の増分ロック パターンがあるという印象を受けました。以下は、アプリケーションが使用している MERGE INTO ステートメントの種類の例です。
MERGE INTO sample_merge_table smt
USING (
SELECT smt.*, sjt.*
FROM sample_merge_table smt
JOIN some_join_table sjt
ON smt.index_value = sjt.secondary_index_value
WHERE smt.partition_index = partitionIndex
) umt ON (smt.partition_index = partitionIndex AND smt.index_value = umt.index_value)
WHEN MATCHED THEN
UPDATE SET...
WHEN NOT MATCHED THEN
INSERT VALUES...
このステートメントを実行すると、ロック手順は実際にはどうなるでしょうか? USING 選択に含まれる各テーブルはロックされますか? sample_merge_table は完全にロックされますか、それともアクセスされているパーティションだけですか? UPDATE ステートメントは段階的にロックしますか、それとも MERGE INTO 自体が必要なロックを既に所有していますか?