Existe uma maneira de transformar a SELECT
declaração abaixo em um DELETE
?
Gostaria de excluir os registros correspondentes retornados da [ETL].[Stage_Claims]
tabela.
Como usei tabelas derivadas, não posso fazer referência à Stage_Claims
tabela.
Para resumir, as 2 tabelas físicas usadas na consulta abaixo possuem estruturas idênticas. A única diferença é DUPS_Claims
um subconjunto de Stage_Claims
.
DUPS_Claims
contém registros duplicados encontrados em arquivos Stage_Claims
. Se um registro existir 3 vezes em Stage_Claims
, teremos esse registro 3 vezes DUPS_Claims
também.
Stage_Claims
contém todos os registros, incluindo os registros duplicados em DUPS_Claims
.
Gostaria de remover os registros duplicados Stage_Claims
deixando apenas 1 registro exclusivo para cada registro duplicado.
Stage_Claims
tem pouco menos de 1 milhão de linhas, então não quero usar Row_Number / Partition em toda a tabela, pois leva mais de 2 minutos para ser executado.
A consulta abaixo é executada em cerca de 15 segundos e identifica com êxito apenas os registros duplicados (sem incluir o registro exclusivo original que queremos manter), mas não consegui descobrir como excluir os registros retornados do SC.
É possível ou devo apenas adotar uma abordagem diferente?
SELECT *
FROM (
SELECT RN = ROW_NUMBER() OVER (
PARTITION BY SC.ID ORDER BY SC.id
)
,SC.*
FROM [ETL].[Stage_Claims] SC
WHERE ID IN (
SELECT ID
FROM (
SELECT RN = ROW_NUMBER() OVER (
PARTITION BY ID ORDER BY id
)
,ID
FROM [ETL].[DUPS_Claims]
) AS t1
WHERE RN > 1
)
) AS t2
WHERE RN > 1
Converta sua instrução select em um CTE e
DELETE FROM
o CTE, como em:Aviso padrão: você deve testar isso em um ambiente de não produção.
Você pode simplificar um pouco sua consulta e provavelmente obter melhor desempenho usando a consulta abaixo, que não faz uso da tabela intermediária
DUPS_Claims
, pois é absolutamente desnecessária:Criei um índice não clusterizado e não exclusivo em ambas as tabelas e, em seguida, examinei os planos de execução para ambas as variações.
A primeira variante:
A segunda variante:
A primeira variante verifica o índice duas vezes, enquanto a segunda variante claramente só precisa verificar o índice uma única vez e não requer uma junção de mesclagem relativamente cara em meu exemplo um tanto artificial.
ETL.Stage_Claims
Minha tabela de amostra contém 89ID
valores exclusivos, cada um duplicado 89 vezes, para um total de 7.921 linhas.Caso os CTEs não sejam o seu forte, você pode usar esta abordagem para excluir de uma tabela derivada:
O plano de consulta acima
DELETE
da tabela derivada: