删除之前检查还是删除行?

时间:2017-12-18 12:00:22

标签: oracle performance plsql

我有table_name

的表PK(id1 VARCHAR2(10), id2 NUMBER, id3 NUMBER)

该表每年仅增加约100万条记录。

问题是在程序A中,如果存在,我必须在table_name中删除1行。

程序A很多用户经常运行。与程序A尝试删除行的次数相比,实际删除的数量(删除现有行)非常小。

那么什么是更好性能:只需删除行(解决方案1),或检查是否存在然后将其删除(解决方案2)?

每个解决方案的行锁怎么样?如果行不存在,DELETE会在proc A的事务中锁定表行吗?

解决方案1 ​​

DELETE table_name 
WHERE id1 = p_id1
    AND id2 = p_id2
    AND id3 = p_id3;

解决方案2

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;

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

  2. 在最糟糕的情况下,第二个解决方案的时间会长两倍,但是尝试成功率与您说的一样小,我想,在两种情况下都会有相同的性能。