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首先必须找到它,这与执行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;