Eu tenho usado o primeiro exemplo de código há anos. Observe não encontrado e não conte.
UPDATE tablename SET val1 = in_val1, val2 = in_val2
WHERE val3 = in_val3;
IF ( sql%notfound ) THEN
INSERT INTO tablename
VALUES (in_val1, in_val2, in_val3);
END IF;
O código abaixo é o código possivelmente novo e aprimorado
MERGE INTO tablename USING dual ON ( val3 = in_val3 )
WHEN MATCHED THEN UPDATE SET val1 = in_val1, val2 = in_val2
WHEN NOT MATCHED THEN INSERT
VALUES (in_val1, in_val2, in_val3)
No primeiro exemplo, a atualização faz uma pesquisa de índice. É necessário, para atualizar a linha direita. O Oracle abre um cursor implícito e o usamos para quebrar uma inserção correspondente, para que saibamos que a inserção acontecerá apenas quando a chave não existir. Mas a inserção é um comando independente e precisa fazer uma segunda pesquisa. Não conheço o funcionamento interno do comando mesclar, mas como o comando é uma única unidade, o Oracle pode executar a inserção ou atualização correta com uma única pesquisa de índice.
Acho que a mesclagem é melhor quando você tem algum processamento a ser feito, o que significa pegar dados de algumas tabelas e atualizar uma tabela, possivelmente inserindo ou excluindo linhas. Mas para o caso de linha única, você pode considerar o primeiro caso, já que a sintaxe é mais comum.