合并到基于分区列的分区表时,MERGE INTO语句是否锁定整个表?

问题描述:

在我们的生产环境中发生了一些性能问题后,我向我们的数据库管理员寻求帮助。在帮助时,他们告诉我,合并锁定表,并建议我改用UPDATE语句。合并到基于分区列的分区表时,MERGE INTO语句是否锁定整个表?

从我读过的所有内容来看,我的印象是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 select的每个表是否会被锁定? sample_merge_table将被完全锁定,还是只有正在访问的分区? UPDATE语句会增量锁定,还是MERGE INTO本身已经拥有所需的锁?

合并语句在行的基础上工作,但在手之前锁定所有内容,即当语句执行完成时计划并识别受影响的行。

阅读:

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