O cenário: Eu tenho um processo ETL. Esse processo envolve ingerir dados de fontes distintas e fazer meu banco de dados sincronizar com o mais recente.
Digamos que eu tenha uma tabela chamada [catalog]. Ela contém o catálogo de produtos da minha empresa. A fonte da verdade para essa tabela me envia um CSV a cada quatro horas. Eu ingiro esse CSV e certifico-me de que minha tabela [catalog] esteja sincronizada com ele. Eu uso uma atualização como esta:
UPDATE mc
SET
[field1] = tc.[field1]
, [field2] = tc.[field2]
FROM [my].[catalog] as mc
INNER JOIN [their].[catalog] as tc
ON mc.id = tc.id
WHERE mc.[field1] <> tc.[field1]
OR mc.[field2] <> tc.[field2]
Este comando comparará cada correspondência e filtrará apenas aqueles que verão mudanças significativas e atualizará apenas essas linhas. Não quero tocar em nenhuma linha desnecessariamente--a tarefa perene dos desenvolvedores de ETL.
Nenhuma atualização trivial será executada (por atualização trivial, quero dizer uma atualização para uma linha que não altera nenhum dos campos naquela linha). As linhas sem alterações permanecem como estavam, sem serem molestadas.
Unmolested é uma boa palavra para usar aqui porque atualizar uma linha sem impactar valores tem um custo desnecessário. Na RAM e no disco, uma atualização de uma linha exclui fisicamente a linha com os valores antigos e insere uma nova linha com os novos valores. Todas essas atualizações precisam ser registradas! Então, no processo de não fazer nada, fragmentamos e dividimos as páginas de índice e dados que temos para a tabela na RAM e no disco. E estamos colocando tráfego desnecessário no log.
Se não estamos mudando nada, então uma atualização trivial ainda está causando rotatividade na RAM e no disco. Dar a uma tabela uma maneira automática de ignorar atualizações triviais seria uma grande vitória para muitos cenários.
Agora, digamos que algum desenvolvedor desajeitado faça uma atualização por meio de algum cliente ou em uma alteração de procedimento que faça algo semelhante a uma tabela grande, mas não inclua nenhuma medida para ignorar linhas que não precisam 'realmente' da atualização. Há algo que eu possa fazer na tabela para fazê-la agir como se soubesse passar atualizações triviais?