【发布时间】: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
【问题讨论】: