Oracle 删除前检查还是只删除行?

Oracle 删除前检查还是只删除行?,oracle,performance,plsql,Oracle,Performance,Plsql,我有一个表table\u name和PK(id1 VARCHAR2(10),id2号码,id3号码) 此表每年仅增长约100万条记录 问题是,在过程A中,如果存在,我必须删除表\u name中的1行 过程A由许多用户频繁运行。与过程A尝试删除行的次数相比,实际删除(删除现有行)的次数非常少 那么,从性能角度看,什么更好呢?:只需删除该行(解决方案1),或者检查是否存在,然后删除它(解决方案2) 每个解决方案的行锁是什么?如果行不存在,是否将删除proc A事务中的锁表行 解决方案1 解决方案2

我有一个表
table\u name
PK(id1 VARCHAR2(10),id2号码,id3号码)

此表每年仅增长约100万条记录

问题是,在过程A中,如果存在,我必须删除
表\u name
中的1行

过程A由许多用户频繁运行。与过程A尝试删除行的次数相比,实际删除(删除现有行)的次数非常少

那么,从性能角度看,什么更好呢?:只需删除该行(解决方案1),或者检查是否存在,然后删除它(解决方案2)

每个解决方案的行锁是什么?如果行不存在,是否将删除proc A事务中的锁表行

解决方案1 解决方案2
选择计数(*)进入l\u检查\u是否存在
从表\u名称
其中id1=p_id1
和id2=p_id2
和id3=p_id3;
如果l_检查_存在0
然后
删除表名称
其中id1=p_id1
和id2=p_id2
和id3=p_id3;
如果结束;
  • 如果行不存在,Oracle无法锁定行。它只是不知道怎么做:)

  • 在最坏的情况下,第二个解决方案的时间要长两倍,但它的尝试成功率和您所说的一样小,我想,在这两种情况下,它的性能是相同的

  • 如果行不存在,Oracle无法锁定行。它只是不知道怎么做:)

  • 在最坏的情况下,第二个解决方案的时间要长两倍,但它的尝试成功率和您所说的一样小,我想,在这两种情况下,它的性能是相同的


  • 只需删除该行。要删除它,Oracle首先必须找到它,这与执行select语句基本相同(但不返回数据)。如果Oracle找不到它,它当然不会删除它。在任何情况下,首先通过SELECT语句自己检查都不会更快


    此外,如果记录不存在,显然也无法锁定它。

    只需删除该行即可。要删除它,Oracle首先必须找到它,这与执行select语句基本相同(但不返回数据)。如果Oracle找不到它,它当然不会删除它。在任何情况下,首先通过SELECT语句自己检查都不会更快

    此外,如果记录不存在,显然也无法锁定它

    DELETE table_name 
    WHERE id1 = p_id1
        AND id2 = p_id2
        AND id3 = p_id3;
    
    SELECT COUNT(*) INTO l_check_exists
    FROM table_name 
    WHERE id1 = p_id1
        AND id2 = p_id2
        AND id3 = p_id3;
    
    IF l_check_exists <> 0
    THEN
        DELETE table_name 
        WHERE id1 = p_id1
            AND id2 = p_id2
            AND id3 = p_id3;
    END IF;