Arquivos
Sorteio, SQL DBA Bundle ($1.895) de graça! Red-Gate!
E ai galera beleza ?
Como alguns de vocês já sabem eu faço parte do programa Friends of Red-Gate e realmente eu gosto MUITO das ferramentas deles.
Atualmente tenho trabalhado muito com o SQL Monitor, e simplesmente não consigo mais viver sem o SQL Prompt, quando vou trabalhar em uma máquina sem ele, ficou maluco!
A Red-Gate também patrocina o meu blog, por isso tem o logozinho deles ai em cima!
Se vocês ainda não conhecem os produtos deles, de verdade, vale a pena dar uma olhada.
Tenho um relacionamento muito bom com eles e recentemente eles me enviaram uma licença do SQL DBA Bundle pra eu sortear no blog
, exato, são $1.895 doletas em produtos deles.
Mano, é sério… isso significa, SQL Prompt + SQL Monitor + SQL Compare + SQL Backup PRO e várias outras ferramentas de graça… imperdível…
Pra participar do sorteio é fácil:
Publique o seguinte texto no seu facebook ou twitter:
“Eu quero ganhar um SQL DBA Bundle da Red-Gate (http://redg.at/Zma34t). Se você também quer leia mais no http://blogfabiano.com”
Coloque um link comprovando sua de sua publicação aqui no meu blog!
Se você não tem facebook, pode usar o twitter, orkut, ou mesmo fazer um reblog desse post no seu blog, o importante é não esquecer de incluir um comentário comprovando sua publicação da promoção.
No mês que vem eu vou fazer o sorteio usando algum serviço de sorteio online qualquer, gravar um video com o sorteio e publicar o resultado no meu blog.
Regras:
- Se eu achar que tenho que mudar alguma coisa no sorteio, eu mudo e pronto e acabo, quem manda nessa porra sou eu.

- Se o vencedor não se manifestar em até 4 dias, farei outro sorteio.
- Caso eu não tenha o e-mail do vencedor, eu vou avisar no dia da publicação do resultado, este deve me enviar seu e-mail no prazo dos 4 dias.
- Só tenho 1 licença, ou seja, haverá apenas 1 ganhador.
- 1 dia antes de fazer o sorteio aviso aqui no meu blog.
- That’s all follks, good luck!
Top 5 Hard-earned Lessons of a DBA
Read lesson two, ‘Beating Backup Corruption’ by Shawn McGehee, and learn how to:
- Avoid subtle failings that could end up defeating your recovery plans.
- Ensure your data pages are corruption free.
- Put together a multi-pronged defence against data corruption.
Learn to beat backup corruption.
Parabéns Delphi por seus 18 anos de vida!
|
Aaaaaaaa hoje é um dia especial pra muitos, e pra mim também! |
Quando comecei a estudar programação no curso técnico em processamento de dados minha aula predileta era a do Elvis carinhosamente chamado por Delphis, ele dava aula de Delphi é claro. Desde lá me apaixonei pelo produto e comecei minha jornada no mundo da informática e programação com Delphi.
Muitos já me ouviram dizer isso, mas quando eu li que a Borland estava vendendo o Delphi foi um dos dias mais tristes da minha vida! Eu era um daqueles que tinha caneca da Borland (uma preta com logo em Branco lindona) e sempre participava da BorCon em sampa, aaa bons tempos aqueles
!
Hoje dia 14 de Fevereiro de 2013 é aniversário de 18 anos do Delphi! Ele foi lançado em 1995 no dia dos namorados (Valentine’s day). Portanto, parabéns Delphi, que você tenha muitos anos de vida e não morra tão cedo! Muita gente ainda usa Delphi e continuará usando, ainda que sem o charme da Borland.
Espero que a Embarcadero continue com o bom trabalho que tem feito até hoje, e que você tenha mais responsabilidades com a maioridade penal chegando.
Algumas fotos totalmente nostálgicas, destaque para o logo do Delphi 5 que usei muito!

Vida longa ao Delphi!
Artigo–DBCC OPTIMIZER_WHAT IF
Artigo novo publicado no Simple-Talk, check it out:
“SQL Server’s Query optimiser judges the best query plan from the data in the relevant tables and the server’s hardware. How, then, can you investigate the query plans being generated for slow-running queries on a customer’s production server when you can neither access the server, nor recreate the database from a backup?”
Abs.
Video PASS24 hours – Escrevento códigos “like a boss”
Update: A animação do PPT não ficou legal no vídeo… baixe o PPT para ver melhor!
Galera, o vídeo da minha sessão sobre T-SQL no PASS24 horas está disponível.
http://www.sqlpass.org/LearningCenter/SessionRecordings/24HoursPortuguese2012.aspx
Você pode baixar o material aqui:
Abaixo alguns prints da sessão:
Espero que gostem!
Abs.
Partes II, III, IV e V dos on-demand de ExecPlans
Galera, depois da boa aceitação do publico para com os treinamentos on-demand estamos publicando novas turmas.
O Luti vai falar sobre indexação: on-demand] Indexação I – Conceitos, criação e estrutura física
O Ivan vai falar sobre T-SQL: [on-demand] Transact SQL I – Introdução e consultas básicas
Eu volto a falar sobre Execution Plans: [on-demand] Planos de execução II – Estatísticas, Seeks e Scans
Novamente estamos fazendo promoção de lançamento, quem comprar até o final do ano, paga R$100,00 reais por cada treinamento.
Aproveitando o embalo, já publiquei o conteúdo dos módulos III, IV e V do treinamento de execution plans, galera tem MUITA coisa boa, e o módulo IV ficou #sinistro
.
Ainda não temos previsão de quando eles serão lançados, mas pretendemos publicar essa informação em breve.
Se você achou interessante e quer fazer uma imersão em sua empresa, converse conosco, quem sabe não passamos alguns dias in-company e sua empresa paga tudo? Melhor impossível não? Qualquer dúvida manda um e-mail pra contato@srnimbus.com.br
Considerando todas os módulos temos as seguintes ementas:
ExecPlans parte I:
Query optimizer: como funciona e como analisar um plano de execução
Otimizando consultas analisando operadores
· Key Lookup e RID Lookup
o O que é?
o Como melhorar consultas com Key Lookup utilizando clausula Include
o Diferença entre Key Lookup e Rid Lookup
o Cuidados com “missing indexes” (dicas do SQL Server)
o Até quando vale a pena fazer um lookup?
o O que é prefetch? Devo me preocupar com ele?
o Nested Loops Optimized, o que é isso?
· Melhorando consultas com o operador Sort
o Otimizando consultas com operadores de SORT
o Ordenação na aplicação ou no banco de dados?
o Monitorando Sort Warnings
o Entendendo memory grant
o xEvent – sort_memory_grant_adjustment
o In-Memory sort versus regular-sort
§ Single pass spill e Multiple Pass spill
o Analisando opções para evitar sort_warnings
· Melhorando consultas com operador Merge Join
o Entendendo o algoritmo de Merge Join
o Evitando Sort Merge Join
o Otimizando Merge Joins em disco
o Cenários propensos a otimização do Merge Join
ExecPlans parte II:
Query optimizer: Estatísticas
· Introdução a estatísticas
o Entendendo como estatísticas funcionam e sua importância
o Lendo um histograma
· Estatísticas avançado parte I
o Manutenção em estatísticas
o Auto Update, Auto Created, Auto update async e norecompute
o Estatísticas filtradas
o Estatísticas cross-table
o Variáveis do tipo table versus tabelas temporárias
· Operadores
o Index scan e table scan
§ Allocation order scan
· Nolock – Uma bomba relógio
· Inconsistências, leitura repetida e pulando linhas
§ Index order scan
· Inconsistências, leitura repetida e pulando linhas
· Advanced scan (merry-go-round scanning)
· Scan direction e paralelismo
o Index Seek
§ Seek predicate
§ Predicate
§ Range scan
§ Quando um seek é na verdade um Scan
§ Seek é sempre melhor que scan?
§ Hints – “Ajudando” otimizador de consultas com ForceSeek
ExecPlans parte III:
Estatísticas avançado parte II
· Estatísticas correlatas e densidade
· Atualizando estatísticas com valores falsos
· TraceFlags – 2388, 2389, 2390, 2371 (SQL2008SP1), 9292, 9204 e 8666.
· Identificando colunas ascendentes
· Date correlation optimization
· Estatísticas faltando
· Gap nas estatísticas
· Estatísticas em várias colunas
· Regra diferenciada para ler um histograma
· Tried trees para estimar strings
· AutoCreated – Computed columns
· Estatísticas em views
· Estatísticas em functions
· Impacto das estatísticas em operações de rebuild
Operadores
· Spool
o Table Spool – Lazzy e Eager
§ Halloween problem
§ Entendendo rebind e rewind
o Index Spool
§ Regra diferenciada para rebind e rewind
o Otimizando planos com operações de spool
o RowCount Spool
o Evitando spools em operações de insert com scalar functions
ExecPlans parte IV:
Detalhando o processo de otimização de uma consulta
· Parse
· Bind
· Query tree
· Constant folding
· Expand view
· Auto parameterization
· Pre-otimization
o NNF convert
o Project remove
o Simplify
§ Constraint
§ Remove redundant
§ Unnest
o Join collapse
o Derive cardinality
o Heuristic join order
o Project nomalization
· Full otimization
o Trivial plan
o Search 0
o Search 1
o Search 2
· Transformation stats (rules)
· Entendendo conceitos importantes
o Seletividade
o Densidade
o Cardinalidade
o Magic Density/Guess
o Foldable expressions
o SARGs
o Simplifications
§ Eliminando joins (FKs)
§ Detectando contradição (Check constraints)
§ Índices únicos (eliminando Asserts)
o NonUpdating updates
· Comandos avançados
o DBCC OPTIMIZER_WHATIF
o Rules (DBCC RULEON/OFF, QueryRuleOff)
o Índices hipotéticos (DBCC AUTOPILOT, SET AUTOPILOT)
o Discos SSDs VS peso do custo de IO/CPU (DBCC SETIOWEIGHT, SETCPUWEIGHT)
o xEvent – inaccurate_cardinality_estimate
Operadores
· Loop join
· Merge join (coberto no módulo I)
· Hash joins
· Hints – “ajudando” otimizador com force order
o Criando bushy plans
· Hints – “ajudando” otimizador forçando um algoritmo de join
ExecPlans parte V:
Aprendendo mais com analise de bugs e ”gaps na funcionalidade” do Otimizador de consultas
· IS NOT NULL
· Comando Merge
· Expression in queries
· Operador de Filter
· Produto cartesiano
· Stream Aggregate
· Filter vs Aggregation
· CTE e colunas duplicadas
Operadores
· Merge interval
· Assert
· Compute Scalar
· Concatenation
· Split, Sort e Collapse
Quebrando mitos
• COUNT(1) versus COUNT(*)
• JOIN versus EXISTS
• DISTINCT versus GROUP BY
• SET versus SELECT
• TOP 1 ORDER BY DESC versus MAX
• UNION versus UNION ALL
• NOT IN versus NOT EXISTS
• CURSOR versus WHILE
• Ordem das tabelas no JOIN
Quer estudar mais sobre o Query Optimizer? Veja onde começar!
Estes dias me pediram recomendação de material para estudar sobre Otimizador de consultas… segue pra vocês o e-mail que respondi.
———————————————————————————–
Tem vários livros/blogs que posso recomendar…
Livros:
Se ainda não comprou, compre o treinamento on-demand da Sr.Nimbus… Vou falar bastante sobre isso, mas bastante mesmo… mais que em qualquer treinamento que já ministramos… vale a pena, vai por mim.
http://www.srnimbus.com.br/calendario/turmas/treinamentos-on-demand/
Inside Microsoft® SQL Server(TM) 2005: Query Tuning and Optimization – Capitulo escrito pelo Craig é o melhor que já li sobre o assunto.
http://www.amazon.com/Inside-Microsoft%C2%AE-SQL-Server-2005/dp/0735621969/ref=pd_bxgy_b_img_y
Inside the SQL Server Query Optimizer – É legalzinho… vale a leitura… o Luti fez um review sobre este livro aqui
SQL Server 2012 Query Performance Tuning do Grant Fritchey
SQL Server 2008 Internals – Capítulo do Conor também é muito bom…
Se sobrar tempo… leia o meu ![]()
http://www.simple-talk.com/books/sql-books/complete-showplan-operators/
Blogs imperdíveis pra quem quer ler sobre o assunto query plan:
http://www.scarydba.com/ – Grant
http://sqlblog.com/blogs/paul_white/ – Fucking freak Paul White…
http://blogs.msdn.com/b/conor_cunningham_msft/ – Blog atual do Conor (OOOO cara em relação a QO no time de desenvolvimento do produto)
http://www.sqlskills.com/blogs/conor/ – Blog do Conor quando ele estava trabalhando na SQLSkils
http://sqlblog.com/blogs/joe_chang/default.aspx – Joe Chang… Maluco total ao quadrado… mto bom.
www.qdpma.com/ – Outro site do Joe Chang
http://sqlblog.com/blogs/rob_farley/default.aspx – Apesar de não ter foco só em QO ele fala bastante sobre o assunto.
http://blogs.msdn.com/b/craigfr/ – Craig trabalha no time de dev do QO… Imperdível.
http://www.benjaminnevarez.com/ – Também fala bastante sobre o assunto, posts muito bons…
http://blogs.msdn.com/b/sqlperf/ – Blog oficial do SQL Server Performance Team da MS…
http://blogs.msdn.com/b/sqlqueryprocessing/ – SQL Server Query Processing Team, preciso dizer mais algo?
http://blogs.msdn.com/queryoptteam – Antigo blog do time de Query Processing
http://www.somewheresomehow.ru/ – Site em Russo mas Google tradutor ajuda… Esse é novo, descobri estes dias.
Se quiser partir pra algo mais deep e científico, leia os artigos publicados na ACM, eu sou associado deles e do grupo SigMod, você paga por ano e tem acesso a uma série de benefícios, como livros da SafariOnline e outras cositas mas… Veja aqui: http://campus.acm.org/public/mgm/subpages/member-benefits.html
Tem vários outros sites e pessoas que falam sobre isso, mas com menos frequência, se você quer começar essa lista já tá de bom tamanho kkk.
Com certeza esqueci de vários… se alguém lembrar fica a vontade em comentar aqui.
Abs.
Join reordering e BushyPlans
Galera acabei de escrever um artigo pro blog da Sr.Nimbus, falei sobre Bushy Plans… Assunto interessante para os geeks de plantão.
http://www.srnimbus.com.br/join-reordering-e-bushyplans-2/
Aproveita e cadastra o RSS do blog da Sr.Nimbus, http://srnimbus.dominiotemporario.com/category/blog/feed/
Abs.
PASS 24 Hours–Amanhã (27/11)
Copia descarada do post do Ivan
http://ivanglima.com/esta-chegando-24-horas-de-pass-portugues/
Não perca, amanhã tem minha sessão sobre T-SQL avançado… amanha as 09:00.
Abs.
———————————————————————————————————
Pessoal, esse mês teremos o primeiro evento 24 Hours de PASS em Português em conjunto com os nossos amigos de Portugal!
24 Horas de PASS – Português
Para quem não conhece, o 24HOP é um evento gratuito e você pode acompanhar tudo on-line. Com duas rodadas de 12h non-stop de SQL Server entre os dias 27 e 28 desse mês, tendo início às 11h de Brasília (ou 13h de Portugal, se você estiver do lado de lá do Atlântico.)
As comunidades Brasileira e Portuguesa prepararam diversas apresentações, e como sempre a Sr. Nimbus não poderia deixar de participar. Nós vamos marcar presença com algumas palestras, sendo que a primeiríssima palestra do evento será nossa! Mais precisamente dos nossos amigos e colegas Fabiano Amorim (Twitter | Blog) e Gilberto Uchôa (Blog):
Sessão 01 – 11:00 (13:00 GMT) "T-SQL Expert – Escrevendo códigos “like a Boss”" Fabiano Amorim & Gilberto Uchôa
A agenda com todas as palestras pode ser encontrada no site do PASS. Dá só uma olhada no pessoal que estará apresentando!
Então não deixe de assistir e aproveite pra aprender bastante SQL Server com os melhores profissionais da área! ![]()
Demonstração – Execplans on demand
Treinamento on-demand de planos de execução e otimização no SQL Server.
Galera depois de váras semanas trabalhando na produção do nosso treinamento on-demand, estou MUITO feliz com o resultado… o treinamento está no ar e gravei um total de 5 horas 51 minutos 34 segundos de vídeos falando sobre otimização no SQL Server.
Eu editei um “teaser“ com 10 mins de “melhores momentos” do treinamento… tem bastante coisa legal. Eu tenho certeza de que qualquer geek ficará muito feliz em ver o que acontece por dentro de um HD ao rodar uma consulta no SQL Server
… pois é, eu abri um só pra te mostrar isso!
Abaixo você pode conferir o vídeo:
Demonstração do treinamento OnDemand – ExecPlans Parte I from Sr. Nimbus on Vimeo.
O Luciano também divulgou um teaser com o treinamento de Transaction Log… terminar o video com WinDbg foi pra fechar com chave de ouro
SENSACIONAL!
Veja o video dele aqui:
Sr. Nimbus Demonstração do treinamento OnDemand – Transaction Log from Sr. Nimbus on Vimeo.
Se interessou? Basta comprar o acesso ao treinamento, esperar receber o acesso aos vídeos e ser feliz
. É sério, R$150,00 reais por isso, tá muito barato…
Novo Desafio SQL Server – Performance 2
O desafio de hoje consiste em melhorar a performance da seguinte consulta:
CHECKPOINT
DBCC DROPCLEANBUFFERS
GO
SET STATISTICS IO ON
SELECT Pedidos.NumeroPedido,
Pedidos.DT_Pedido,
Pedidos.Valor,
SUM(ItensPed.Qtde) AS TotalItens
FROM Pedidos
INNER JOIN ItensPed
ON Pedidos.NumeroPedido = ItensPed.NumeroPedido
INNER JOIN Produtos
ON ItensPed.ID_Produto = Produtos.ID_Produto
WHERE Pedidos.DT_Pedido BETWEEN ’20121010′ AND ’20121020′
AND Produtos.Descricao like ‘%cicle%’
GROUP BY Pedidos.NumeroPedido,
Pedidos.DT_Pedido,
Pedidos.Valor
OPTION (RECOMPILE, MAXDOP 1)
SET STATISTICS IO OFF
Originalmente a consulta faz as seguintes leituras.
STATISTICS IO:
Table ‘ItensPed’. Scan count 0, logical reads 19840, physical reads 1, read-ahead reads 11900
Table ‘Pedidos’. Scan count 1, logical reads 230, physical reads 1, read-ahead reads 221
Table ‘Worktable’. Scan count 1, logical reads 3818, physical reads 0, read-ahead reads 0
Table ‘Produtos’. Scan count 1, logical reads 2283, physical reads 3, read-ahead reads 2270
Profiler:
Vamos focar em melhorar o tempo, mas principalmente o número de leituras de páginas que são executadas nas tabelas.
Eu consegui fechar com os seguintes números:
STATISTICS IO:
Table ‘…’. Scan count 3, logical reads 9, physical reads 4, read-ahead reads 0
Table ‘…’. Scan count 1, logical reads 9, physical reads 1, read-ahead reads 7
Table ‘…’. Scan count 1, logical reads 3, physical reads 3, read-ahead reads 0
Table ‘Worktable’. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0
Table ‘ItensPed’. Scan count 1, logical reads 652, physical reads 2, read-ahead reads 654
Table ‘Produtos’. Scan count 0, logical reads 6, physical reads 3, read-ahead reads 0
Table ‘Pedidos’. Scan count 1, logical reads 8, physical reads 1, read-ahead reads 6
Profiler:
/*
Regras
* Não pode mudar índice cluster
* Não pode mudar schema das tabelas existentes (fks, datatype, nullable…)
* Pode criar quantos índices forem necessários (exceto cluster)
* Vale usar view indexadas
* Vale criar novos objetos (procedures, views, triggers, functions…)
* Vale reescrever a consulta
* Pelo menos 5 caracteres obrigatoriamente são utilizados para fazer o filtro pela descrição do produto
* Valores utilizados como filtro não são fixos… ou seja, tem que funcionar para qualquer valor que for solicitado
*/
Segue script para criar e popular as tabelas:
USE tempdb
GO
IF OBJECT_ID(‘Produtos’) IS NOT NULL
DROP TABLE Produtos
GO
CREATE TABLE Produtos (ID_Produto Int IDENTITY(1,1) PRIMARY KEY,
Descricao VarChar(400),
Col1 VarChar(400) DEFAULT NEWID())
GO
INSERT INTO Produtos (Descricao)
VALUES (‘Bicicleta’), (‘Carro’), (‘Motocicleta’), (‘Trator’)
GO
;WITH CTE_1
AS
(
SELECT TOP 200000 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rn
FROM sysobjects a, sysobjects b, sysobjects c, sysobjects d
)
INSERT INTO Produtos (Descricao)
SELECT REPLACE(NEWID(), ‘-’, ‘ ‘)
FROM CTE_1
GO
–SELECT * FROM Produtos
–GO
IF OBJECT_ID(‘ItensPed’) IS NOT NULL
DROP TABLE ItensPed
GO
IF OBJECT_ID(‘Pedidos’) IS NOT NULL
DROP TABLE Pedidos
GO
CREATE TABLE Pedidos (NumeroPedido VarChar(80) PRIMARY KEY,
DT_Pedido Date,
ID_Cliente Int,
Valor Float)
GO
;WITH CTE_1
AS
(
SELECT TOP 50000 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rn
FROM sysobjects a, sysobjects b, sysobjects c, sysobjects d
)
INSERT INTO Pedidos(NumeroPedido, DT_Pedido, ID_Cliente, Valor)
SELECT ‘Ped-’ + CONVERT(VarChar, rn), – Composto por "Ped + NumeroSequencial"
GetDate() - ABS(CheckSum(NEWID()) / 10000000),
ABS(CHECKSUM(NEWID())) / 1000000 AS ID_Cliente,
ABS(CHECKSUM(NEWID())) / 100000. AS Valor
FROM CTE_1
GO
–SELECT * FROM Pedidos
–GO
IF OBJECT_ID(‘ItensPed’) IS NOT NULL
DROP TABLE ItensPed
GO
CREATE TABLE ItensPed (NumeroPedido VarChar(80) FOREIGN KEY REFERENCES Pedidos(NumeroPedido),
DT_Entrega Date,
ID_Produto Int,
Qtde SmallInt,
PRIMARY KEY(NumeroPedido, ID_Produto) WITH(IGNORE_DUP_KEY=ON))
GO
INSERT INTO ItensPed(NumeroPedido, DT_Entrega, ID_Produto, Qtde)
SELECT NumeroPedido,
DATEADD(d, ABS(CheckSum(NEWID()) / 100000000), DT_Pedido),
ABS(CHECKSUM(NEWID())) / 1000000 + 1 AS ID_Produto,
ABS(CHECKSUM(NEWID())) / 1000000. AS Qtde
FROM Pedidos
GO 100
–SELECT * FROM ItensPed
–GO
Olhos atentos já viram que dei uma dica… Divirta-se e boa sorte!
Abs.





