我有桌子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;
只需删除该行即可。要删除它,Oracle首先必须找到它,这与执行select语句基本相同(但不返回数据)。如果Oracle没有找到它,它当然不会删除它。没有任何情况下通过SELECT语句首先自己检查会更快。
此外,如果记录不存在,显然也无法锁定。