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 (7)

  1. Definir uma View com TOP + ORDER BY. Depois, “DELETE FROM [VIEW]”. Realmente, uma solução elegante!

  2. Felipe de Assis disse:

    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 #Tmp
    CREATE TABLE #Tmp (ID INT)
    INSERT INTO #Tmp SELECT TOP 1000 ID FROM tbLogs ORDER BY DTHORARIO
    DELETE A FROM tbLogs A
    WHERE 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).

    1. Tabela temporaria vai ajudar, mas o ideal seria usar uma construçao com CTE.

  3. Guilherme disse:

    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!?

    1. Correto, não precisa criar uma View.

  4. Um comentário adicional: faltou falar sobre os índices. O ideal é adicionar um índice clustered sobre a coluna de horário.

Skip to main content