Otimizando DELETE TOP 1000

No último post, comentei do desafio do DELETE de 1000 linhas, que consistia em resolver um problema bastante comum: Problema: Apagar os 1000 registros mais antigos da tabela. A fim de tornar a situação mais real, criei uma tabela e inseri 1 milhão de registros. Frequentemente, vejo que os programadores executam o seguinte SELECT para…

0

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. Em seguida, populamos a tabela com 10000 linhas: Esse tipo de tabela normalmente cresce rapidamente com muitos dados…

7

View vs Function

No artigo anterior, fiz uma breve introdução sobre Views e comentei que não há diferença de desempenho em usar Tabela, View ou CTE. Agora vamos criar uma View e uma Function para fazer a comparação. Note que a sintaxe do CREATE FUNCTION é um pouco mais extensa, pois define o tipo de dado a ser…

0

Tabelas, Views, CTE e Synonyms

View é um dos recursos mais poderosos do banco de dados relacional. Podemos usar as Views como sinônimos de tabela, facilitando o acesso aos dados. Por exemplo, vamos usar uma tabela de usuário definida com dois campos: Poderíamos simplificar a definição da tabela usando uma view: Assim, podemos acessar a tabela de usuários diretamente pela…

0

Desafio: Cadê meu Join?

Dessa vez apresento um desafio curioso que recebi esses dias enquanto estava no escritório. Uma pessoa me apresentou uma consulta SQL que relacionava os dados de cliente com os endereços. SELECT c.* FROM Clientes c LEFT OUTER JOIN Regioes r ON c.regiaoId = r.regiaoId ANDr.regiaoId IS NULL O interessante é que o plano de execução…

12

Query Recursiva

Você sabia que o SQL Server consegue criar uma Query Recursiva? Utilizamos, como exemplo, uma tabela que armazena as informações de MENU de uma página Web. CREATE TABLE tbMenu ( id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, idPai INT NULL, Nome VARCHAR(30) NOT NULL ) INSERT tbMenu (idPai,Nome) VALUES (NULL,’Menu’),(1,’Vestuario’),(1,’Brinquedo’),(1,’Informatica’), (2,’Terno’),(2,’Casaco’),(2,’Sapato’),(2,’Meia’),(3,’Carrinho’), (3,’Boneca’),(4,’Netbook’),(4,’Webcam’),(4,’Desktop’) SELECT * FROM…

12

Desafio: Erros gerados em consulta indexada

  No desafio anterior, comentamos sobre a restrição de uso do ORDER BY dentro de uma View. Dessa vez, o desafio está relacionado a uma consulta que passa a gerar erros após a criação de índices. Imagine uma tabela composta pelos campos (ID, Nome, Idade) como na figura abaixo e uma consulta para determinar o…

9

Desafio: Usando ORDER BY dentro de uma VIEW

Deixo compartilhar uma situação que ocorreu no trabalho: o desenvolvedor utilizava uma view para retornar os dados ordenados. Segundo ele, o comando abaixo funcionava no SQL 2000, mas deixou de funcionar no SQL 2005. CREATE VIEW vwOperacao AS SELECT * FROM tbOperacao ORDER BY data Msg 1033, Level 15, State 1, Procedure vwOperacao, Line 4…

6

Atualizando as estatistica apos INDEX REBUILD

Sabe-se que as estatísticas são atualizadas durante a recriação de índice (ALTER INDEX REBUILD). Então, surge uma dúvida: se o processo noturno de manutenção realiza o rebuild de índice diariamente, ainda é necessário atualizar as estatísticas? Com o objetivo de responder essa pergunta, vamos criar um cenário para teste com as tabelas tbUsuario e tbObjetos….

3

Estatísticas

Como verificar as estatísticas relacionadas a uma tabela? SELECT [LastUpdate] = STATS_DATE(object_id, stats_id), [Table] = OBJECT_NAME(object_id), [Statistic] = name FROM sys.stats WHERE object_id = OBJECT_ID(‘tbUsuario’) As estatísticas podem ter origens distintas: Criadas explicitamente com CREATE STATISTICS Implicitamente pelo CREATE INDEX Criadas pelo otimizador (Auto-stats) Hipotéticas (usadas pelo Database Tuning Wizard)

0