Isso pode soar como uma pergunta estúpida, mas não consigo encontrar uma maneira melhor. É um sistema de postagem onde as lojas nos enviam informações diariamente (pode ser por vários dias). Essa informação é colocada em TempTable. Para cada dia encontrado no TempTable é sempre um dia inteiro, e o TempTable é bom para todas as lojas encontradas nele. Portanto, se TempTable tiver 2 lojas diferentes e 2 dias diferentes, como Day1-Store1 e Day2-Store2, isso significaria que nada aconteceu no Day1 para Store2 e no Day2 para Store1.
Então, quero deletar qualquer registro que o BigTable tenha (para um Dia e Loja Específicos) que não esteja na tempTable (para os Dias encontrados e Lojas Encontrados na TempTable) Em outras palavras, Se Temptable tiver uma entrada para Day1-Store1 e Day2-Store2, preciso deletar da Big Table Day1-Store2 e Day2-Store1 e qualquer outra entrada que não esteja na tabela temporária...
Isso é o que estou usando agora (funciona), mas demora muito. Estou procurando uma maneira de minimizar o número de junções na TempTable. Índices agrupados correspondentes existem em BigTable e TempTable (Data/Loja/SKU_id)
Delete X
From BigTable X
join (Select Distinct postingDate from TempTable) D on X.PostingDate = D.PostingDate
Join (Select Distinct postingStore from TempTable) S on X.Store = S.PostingStore
Left join TempTable T on X.PostingDate = T.PostingDate
and X.Store = T.PostingStore and X.SKU_id = T.SKU_id
Where T.Sku_id is null
Tenho certeza que esta não é a melhor maneira de fazer isso. Agradecendo a todos antecipadamente
[MAIS INFORMAÇÕES] Como percebi que as sugestões dadas postadas são para excluir tudo no BigTable que não está no TempTable, pensei que deveria adicionar o seguinte ponto:
BigTable contém Todos os dias para todas as lojas que já foram postadas. TempTable contém as informações de postagem de dias e lojas específicos encontrados em TempTable. Desejo excluir do BigTable os Stores e Days encontrados no TempTable, mas sem excluir as boas entradas que já estão no BigTable.
Se Big Table tiver as seguintes entradas:
Day1 Store1 Sku123 ...
Day1 Store2 Sku124 ...
Day1 Store3 Sku123 ...
Day2 Store1 Sku124 ...
Day2 Store2 Sku123 ...
Day2 Store3 Sku123 ...
E TmpTable tem as seguintes entradas:
Day1 Store1 Sku124 ...
Day2 Store2 Sku123 ...
Gostaria de excluir do BigTable qualquer registro para Day1 e Day2 para Store1 e Store2 que não esteja em TempTable... Portanto, gostaria de excluir os seguintes registros do BigTable:
Day1 Store1 Sku123 ...
Day1 Store2 Sku124 ...
Day2 Store1 Sku124 ...
Se bem entendi, essas consultas devem funcionar:
Qualquer uma dessas 2 consultas excluirá as mesmas linhas.
Na minha amostra de teste, eles são mais eficientes, mas minhas tabelas de teste não correspondem aos seus dados e você terá que testá-los. Todos eles fazem 4 varreduras de tabela, mas a nova consulta não classifica os dados (não
DISTINCT
).Você pode fornecer os dois planos de execução (consulta antiga e nova) para análise posterior.
Pode ser útil adicionar um índice em POSTINGDATE e POSTINGStore ou POSTINGDATE/postingStore/sku_id. Se CLUSTERED INDEX em TempTable (Date/Store/SKU_id) não for suficientemente estreito (3 varchar...), pode ser melhor removê-lo.
Uma dessas opções (logicamente, se não equivalente em desempenho) deve funcionar para você:
OU
OU