Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como realizar UPDATE e DELETE com TOP x registros

Visualizações: 13.865 views
Tempo de Leitura: 3 minutos

OlĂ¡ pessoal,
Bom dia!

Hoje vou mostrar pra vocĂªs como atualizar ou apagar um nĂºmero fixo de registros de uma tabela, que pode ser utilizado para manipular os dados da tabela sem travĂ¡-la por muito tempo durante a execuĂ§Ă£o das queries.

GeraĂ§Ă£o de uma base simples

Vou demonstrar como criar a base de testes que iremos utilizar neste post

UPDATE TOP

Muita gente nĂ£o sabe, mas a instruĂ§Ă£o UPDATE suporta o uso do TOP para delimitar a quantidade de registros a ser atualizada:

SQL Server - Update TOP 1

Embora bem simples, esse comando pode acabar enganando vocĂª. Isso acontece porque quando vocĂª utiliza um comando TOP sem utilizar o ORDER BY, o resultado nĂ£o Ă© determinĂ­stico. Toda vez que vocĂª for utilizar um TOP, vocĂª deve utilizar um ORDER BY para indicar para o banco como irĂ¡ ordenar os resultados e depois filtrar utilizando o TOP. Mesmo que a tabela tenha Ă­ndice clustered, isso nĂ£o garante que os dados serĂ£o ordenados utilizando o Ă­ndice clustered ou com o RowID no caso de tabelas HEAP.

Apesar o UPDATE suportar o TOP, ele nĂ£o suporta o ORDER BY. Para resolver essa situaĂ§Ă£o, podemos realizar esse mesmo update desta forma:

Ou pode ser feito ainda com CTE (Common Table Expressions), que Ă© uma forma mais elegante e eficiente:

Resultado:
SQL Server - Update TOP 1 _2

Comparando o plano de execuĂ§Ă£o:
SQL Server - Update TOP 1 Execution Plan

SQL Server - Update TOP 1 Execution Plan 2

Conforme indicado acima, a soluĂ§Ă£o utilizando o CTE Ă© mais elegante e performĂ¡tica, sendo executada em um tempo menor e consumindo menos disco e CPU

DELETE TOP

Assim como utilizamos no UPDATE, podemos utilizar o TOP no prĂ³prio DELETE, correndo o risco de apagar registros aleatĂ³rios e tambĂ©m podemos utilizar o ORDER BY tanto o JOIN no update quanto o CTE para filtrar e limitar os registros que serĂ£o removidos:

Exemplo:
SQL Server - Delete TOP 1_3

É isso aí, pessoal!
Um abraço e atĂ© o prĂ³ximo post.