6

本番環境でパフォーマンスの問題が発生した後、データベース管理者に支援を求めました。手伝いをしているときに、マージするとテーブルがロックされることを知らされ、代わりに 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 自体が必要なロックを既に所有していますか?

4

1 に答える 1

2

マージ ステートメントは行単位で機能しますが、事前にすべてロックします。つまり、ステートメントの実行の計画が完了し、影響を受ける行が特定されると、すべてがロックされます。

読み:

https://forums.oracle.com/message/4372012

于 2013-11-05T02:49:00.420 に答える