【问题标题】:MERGE on Oracle table with high hit rate of updates更新命中率高的 Oracle 表上的 MERGE
【发布时间】:2015-02-26 08:38:09
【问题描述】:

我试图找到有关 Oracle MERGE 语句与传统选择插入/更新的性能的一些细节,但无法找到与我的情况有关的东西。

我在我的代码中使用 MERGE 语句作为 UPSERT 语句,示例如下:

    MERGE INTO table_a a USING dual d ON (a.keyone='a' AND a.keytwo='b')
    WHEN MATCHED THEN UPDATE SET a_column='c'
    WHEN NOT MATCHED THEN INSERT (keyone,keytwo,a_column) VALUES ('a','b','c')

这将始终用于仅更新具有近 7000 万行的表中的一条记录。但我遇到了一些阻塞/锁定问题。

我想知道,如果另一个进程同时针对这个“table_a”发布更新,例如

    UPDATE table_a SET a_column='c' WHERE keyone='d' AND keytwo='e'

但是从不针对相同的键,可能是 MERGE 语句需要很长时间才能针对相当大的表执行,从而阻止随后对具有其他键的行进行的更新? (更新语句的键总是不同的)

这些都将在同一时间发生(一个服务发布合并,其他服务发布对 table_a 的更新)

我做错了吗?我应该只做一个 SELECT 然后根据结果对这么大的表进行 INSERT 或 UPDATE 吗?我认为只有在 2 个语句尝试访问同一行资源时才会发生阻塞。

编辑:忘了说,table_a 没有很多列,它本质上是

    key_one number
    key_two number
    key_three varchar(1)
    creation_date_time, mod_date_time

【问题讨论】:

    标签: oracle merge


    【解决方案1】:

    我说把 MERGE 放进去。如果你开始遇到问题,如果需要,用 INSERT/UPDATE 逻辑替换它;但在你有问题之前,你没有问题。做可能可行的最简单的事情。我不会先做一个 SELECT 。执行 UPDATE,检查 SQL%ROWCOUNT(或其他),然后在需要时执行 INSERT。

    分享和享受。

    【讨论】:

    • 嗨,鲍勃,感谢您的回复!今天我正在使用 MERGE,这是我遇到锁定问题的地方,尽管两个进程都没有访问相同的记录。这导致我唯一的猜测是 MERGE 需要一段时间并且 UPDATE 被搁置,但我认为 Oracle 可能能够毫无问题地处理它。
    • 然后尝试用 UPDATE/INSERT 替换 MERGE,看看是否可以解决问题。
    猜你喜欢
    • 2019-03-30
    • 2013-06-11
    • 2021-04-24
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多