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

问题描述 投票:1回答:2

我有桌子table_namePK(id1 VARCHAR2(10), id2 NUMBER, id3 NUMBER)

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

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

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

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

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

Solution 1

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

Solution 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;
oracle performance plsql
2个回答
4
投票

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

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


1
投票
  1. 如果行不存在,Oracle无法锁定行。它只是不知道该怎么做:)
  2. 在最糟糕的情况下,第二个解决方案是两倍长,但它尝试成功率与你说的一样小,我猜,在两种情况下它都是相同的性能。
© www.soinside.com 2019 - 2024. All rights reserved.