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

标签 sql oracle11g

在我们的生产环境中出现一些性能问题后,我向我们的数据库管理员寻求帮助。在提供帮助的同时,他们告诉我合并会锁定表并建议我改用 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 select 中涉及的每个表都会被锁定吗? sample_merge_table 会被完全锁定,还是只锁定正在访问的分区? UPDATE 语句是增量锁定,还是 MERGE INTO 本身已经拥有所需的锁定?

最佳答案

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

阅读:

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

关于sql - 合并到基于分区列的分区表时,MERGE INTO 语句是否锁定整个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936152/

相关文章:

复杂查询的 MySQL 查询优化

sql - 一个和三个其他表之间的最佳关系

c# - INSERT INTO 语句的问题

sql - PLSQL 从字符串中获取值

spring-mvc - Jboss As 7.1 ModuleNotFoundException : Module com. oracle:main is not found

sql - 如何在仅插入数据库中创建具有依赖元素的草稿页面

c# - Entity Framework 代码优先和 SQL Server 2012 序列

sql - 错误 (38,1) : PL/SQL: ORA-00932: inconsistent datatypes: expected DATE got NUMBER

oracle - 从另一个用户访问 Oracle 模式对象而不使用用户前缀

sql - Oracle SQL,如何选择组中的第一行?