我有table_name
PK(id1 VARCHAR2(10), id2 NUMBER, id3 NUMBER)
该表每年仅增加约100万条记录。
问题是在程序A中,如果存在,我必须在table_name
中删除1行。
程序A很多用户经常运行。与程序A尝试删除行的次数相比,实际删除的数量(删除现有行)非常小。
那么什么是更好性能:只需删除行(解决方案1),或检查是否存在然后将其删除(解决方案2)?
每个解决方案的行锁怎么样?如果行不存在,DELETE会在proc A的事务中锁定表行吗?
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;
答案 0 :(得分:4)
只需删除该行即可。要删除它,Oracle首先必须找到它,这与执行select语句基本相同(但不返回数据)。如果甲骨文没有找到它,它当然不会删除它。没有任何情况下通过SELECT语句自己检查会更快。
此外,如果记录不存在,显然也无法锁定。
答案 1 :(得分:1)
如果行不存在,Oracle无法锁定行。它只是不知道该怎么做:)
在最糟糕的情况下,第二个解决方案的时间会长两倍,但是尝试成功率与您说的一样小,我想,在两种情况下都会有相同的性能。