【问题标题】:PLSQL - Fastest way to check for dups before insertPLSQL - 插入前检查重复数据的最快方法
【发布时间】:2014-03-08 11:08:41
【问题描述】:

(使用 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;

谢谢!

【问题讨论】:

    标签: sql oracle insert duplicates primary-key


    【解决方案1】:

    就性能而言,当然第二种选择更好。

    但是,更重要的是,第一个选项有一个错误 - 如果多个会话尝试同时插入相同的值,它将失败 - 其中一个会成功,另一个会话将等待第一个提交然后引发 DUP_VAL_ON_INDEX (您尚未处理)。

    【讨论】:

      【解决方案2】:

      我认为你可以尝试合并。通常,您应该避免 count() 进行重复检查。还有一个提示可以用来忽略重复项。这个页面给出了一个很好的例子。

      http://guyharrison.squarespace.com/blog/2010/1/1/the-11gr2-ignore_row_on_dupkey_index-hint.html

      【讨论】:

      • 好吧,我不同意那部分,但它的目的是展示查询提示方法,这就是全部......当表变得大量时可能会变得昂贵。除非你的桌子很大,否则计数路线是最简单的。
      • 计数可能很昂贵,并且可能会破坏其他未来选择的缓存,因为将解析和读取大量记录。如果您遇到实际的性能问题,则不使用 count() 只会使其变得更加复杂。最后,即使您执行 count(),由于并行性,您仍然需要异常处理
      • 如果您插入单个值,无论哪种方式都会非常快。使其非常快速的方法是批量插入大量值或从选择查询中插入。根据我的经验,您在这里优化的是花生
      猜你喜欢
      • 2014-10-04
      • 2020-02-28
      • 2017-03-26
      • 2012-11-18
      • 2014-03-16
      • 2021-10-30
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多