Tenho procurado muito por esse tipo de comparação ou algum tipo de equilíbrio de desempenho.
O que sei até agora é o seguinte:
MERGE é um comando T-SQL que já está implementado no SQL Server. Até onde eu sei, ele funciona muito bem, pois usa "mais ou menos " mapeamento de hash INNER JOIN para inserir e atualizar, mas tenho tido alguns problemas ao excluir na mesma instrução MERGE também ao usar CLUSTERED INDEX . Além disso, é muito rápido e permite que eu faça algumas cláusulas de comparação antes de atualizar ou inserir algo, por isso é muito flexível para mim.
No SQL Server, alguns cenários específicos preferem usar UPDATE e INSERT como instruções separadas e eu não discutiria isso. Em minha curta experiência, eu usaria MERGE por padrão como padrão para meu código.
Agora como DBA, estou enfrentando um novo desafio, tenho que gerenciar servidores MySQL também, então acabei procurando um comportamento MERGE semelhante no MySQL para melhorar o desempenho das consultas. Até agora, não encontrei nada parecido, mas INSERT ... ON DUPLICATE KEY ... UPDATE . Ainda assim, tenho algumas dúvidas de desempenho, pois não tenho certeza de como ele se comporta com o servidor, como funciona e se um par opcional de instruções funcionaria melhor ou mais rápido do que isso.
Procurando no MySQL, encontrei UPDATE + INSERT IGNORE , UPDATE + INSERT , INSERT ... REPLACE e assim por diante.
A documentação do MySQL é um pouco confusa ao tentar determinar se eu poderia usar algumas outras cláusulas ex. na instrução MERGE eu poderia usar AND (TARGET.COLUMN_X > 'VALUE') :
MERGE _TABLE A_ AS TARGET WITH _TABLE B_ AS SOURCE ON (TARGET.KEY = SOURCE.KEY) WHEN MATCHED AND (TARGET.COLUMN_X > 'VALUE') UPDATE TARGET.COLUMN_A = SOURCE.COLUMN_A ...
Não encontro como fazer isso no MySQL.
*CONSIDERAÇÃO
Eu tenho que administrar isso para obter melhor resultado de tempo e desempenho amigável.
O que tenho como configuração:
PERCONA MySQL
- txt que precisa ser carregado em uma tabela a cada mês com novos dados e algumas alterações (é por isso que estou procurando uma declaração semelhante a MERGE )
- Mecanismo InnoDB MySQL
- Tabelas de banco de dados relacional, portanto, não posso excluir ou truncar a tabela de destino porque todas elas estão relacionadas.