(使用Oracle)我有一个包含一列(myCol)的表,它是主键。
在进行插入时,在执行插入之前检查select语句是否更快,或者只是编写插入并让错误处理检查它?
那会更快吗?
BEGIN
SELECT count(*) INTO v_count FROM myTbl WHERE myCol = v_newVal;
IF v_count = 0 THEN
INSERT INTO myTbl (myCol) VALUES (v_newVal);
END IF;
END;
还是这个?
BEGIN
INSERT INTO myTbl (myCol) VALUES (v_newVal);
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
null;
END;
谢谢!
答案 0 :(得分:1)
我想你可以尝试合并。通常,您应该避免重复检查count()。还有一个提示可以用来忽略重复项。这个页面给出了一个很好的例子。
http://guyharrison.squarespace.com/blog/2010/1/1/the-11gr2-ignore_row_on_dupkey_index-hint.html
答案 1 :(得分:1)
就性能而言,第二种选择当然更好。
但是,更重要的是,第一个选项有一个错误 - 如果多个会话尝试同时插入相同的值,它将失败 - 其中一个会成功,另一个会话将等待第一个提交然后提出DUP_VAL_ON_INDEX(你还没有处理)。