Desafio: DELETE 1000 Linhas

Esse é o primeiro desafio da Série “Another point of VIEW”, na qual abordamos o uso de Views.

A situação é comum e ocorre em várias aplicações. Temos uma tabela que armazena um grande volume de dados.

image

Em seguida, populamos a tabela com 10000 linhas:

image

Esse tipo de tabela normalmente cresce rapidamente com muitos dados e, por isso, periodicamente é necessário apagar os registros. Entretanto, vamos apagar somente os 1000 registros mais antigos.

Uma forma seria escrever esse comando:

image

O plano de execução é complexo e tem custo 0.83 para apenas 10000 registros. Se fossem milhões de registros, o custo aumentaria e o comando ficaria executando por minutos.

image

 

Como você otimizaria essa consulta?

Essa query é um problema!

Será que adianta adicionar índices?

Será que reescrever resolve?

image

Resposta no próximo artigo.

Comments

  • Anonymous
    July 26, 2016
    Definir uma View com TOP + ORDER BY. Depois, "DELETE FROM [VIEW]". Realmente, uma solução elegante!
    • Anonymous
      August 04, 2016
      Na mosca!
  • Anonymous
    July 27, 2016
    Se for possível criar índices (dependendo de janela, tamanho da tabela, existência de outros índices, etc.) eu faria o seguinte:CREATE UNIQUE CLUSTERED INDEX IX1 ON tbLogs (ID) CREATE NONCLUSTERED INDEX IX2 ON tbLogs (DTHORARIO) Depois mudaria a query para o seguinte:DROP TABLE IF EXISTS #TmpCREATE TABLE #Tmp (ID INT)INSERT INTO #Tmp SELECT TOP 1000 ID FROM tbLogs ORDER BY DTHORARIODELETE A FROM tbLogs AWHERE EXISTS (SELECT 1 FROM #Tmp B WHERE A.ID = B.ID)Usando a mesma tabela, mas contendo pouco mais de 500 mil registros, essas mudanças fizeram com que os comandos (INSERT e depois DELETE) tivessem custos aproximados de 0,019 e 0,037, respectivamente, contra 27,57 do comando apresentado no desafio (custo de execução também considerando a tabela com pouco mais de 500 mil registros).
    • Anonymous
      August 04, 2016
      Tabela temporaria vai ajudar, mas o ideal seria usar uma construçao com CTE.
  • Anonymous
    August 03, 2016
    Usando cte com top e order by. Delete from cte.Criar view só com a finalidade de excluir linhas da tabela acho desnecessário não!?
    • Anonymous
      August 04, 2016
      Correto, não precisa criar uma View.
  • Anonymous
    August 04, 2016
    Um comentário adicional: faltou falar sobre os índices. O ideal é adicionar um índice clustered sobre a coluna de horário.