Arquivo
Palestra FAEF – Como foi…
Pessoal, conforme prometi deixo aqui o link para o PPT e os arquivos que utilizei na palestra.
Foi um prazer participar desta jornada que contou com a presença de vários profissionais do Mercado.
No dia 17 eu dividi a bancada com o Rodrigo que é mestre em Engenharia de Construção Civil pela Politécnica da Universidade de São Paulo, que deu um show falando sobre Projetos, citando o seu caso de sucesso em realidade virtual.
Quando a professora Lidia me chamou para iniciar a palestra, fiquei bem contente com o que ví, vários alunos bem interessados em participar e aprender sobre SQL Server, pena que o tempo foi curto, mas com certeza valeu a pena.
Espero que tenham gostado, eu gostei…
Agradeço a professora Simone que me encontrou pela Internet e ao Google(ou será que ela usou Bing?) por me apresentar a Ela…
Segue algumas fotos e o link para download dos arquivos…
http://cid-52eff7477e74caa6.skydrive.live.com/embedicon.aspx/Publica/PalestraFAEF
Abraço.
NPTEL Courses – Computer Science & Engineering – Database Design
É por isso que eu sempre digo, apesar do inglês sofrível de ouvir, nossos amigos indianos são demais 🙂
Acesse o link abaixo para visualizar vários cursos relacionados a IT e afins …
http://nptel.iitm.ac.in/index.php
Deixo como destaque o curso de Database Design, e mais destaque ainda para os módulos sobre Query Processing and Optimization :-).
14 – Query Processing and Optimization [56:41]
15 – Query Processing and Optimization II [56:55]
16 – Query Processing and Optimization – III [57:19]
Divirta-se!
Palestra na FAEF Garça – SP
Pessoal convido a todos que estiverem aqui pelo interior de São Paulo, para participar da jornada de Sistema de Informação que acontecerá na FAEF em Garça.
Tive a honra de receber o convite para participar como Palestrante, no dia 17/11 próxima terça-feira vou falar sobre Certificações e SQL Server.
Se estiver por aqui… conto com sua presença…
Valew
Query Optimizer VS Foreign Keys – The answer
Pessoal,
Depois que eu postei falando sobre o comportamento do QO em relação a Foreign Keys, resolvi enviar um exemplo para o meu Mestre em Query Processor Conor Cunningham.
Bom como sempre ele deu um show de resposta… Concordo com ele que deve ser MUITO difícil decidir o que entra e o que fica de fora do QO, encontrar este balanceamento perfeito entre o tempo de criação do plano versus a quantidade de analises que são efetuadas é sem dúvida uma árdua tarefa.
Eu sonho com o dia em que conseguiremos de alguma forma deixar o QO tão esperto a ponto de não se preocupar com as “Mentes Brilhantes” que vemos por ai… Até que este dia não chegue, escreva suas consultas com atenção e quando terminar de escrevê-la sempre pense, ficou bom?
Leitura imperdível.
http://blogs.msdn.com/conor_cunningham_msft/
Abraço.
Query Optimizer VS Foreign Keys
Pessoal, depois da WebCast que fiz falando sobre o Query Optimizer, quero compartilhar um caso onde na minha opinião ele infelizmente não foi tão esperto assim 😦
Por sinal o vídeo já esta disponível para download…. é só acessar o link de cadastro para a webcast e baixar…
Veja bem, no meu banco de dados tenho 2 tabelas assim…
CONCC030 – Tabela de propostas, e CONCC036 tabela que relaciona uma proposta com uma Cota.
As chaves das duas tabelas são, ID_Empresa, ID_Documento, ID_Tipo_Documento. Na tabela CONCC036 eu tenho uma foreign key forçando a integridade entre as tabelas. A foreign key é formada pelas 3 colunas que acabei de mencionar.
Tenho uma consulta assim:
SELECT ID_Bem
FROM CONCC030
INNER JOIN CONCC036
ON CONCC036.ID_Tipo_Documento = CONCC030.ID_Tipo_Documento
AND CONCC036.ID_Documento = CONCC030.ID_Documento
WHERE CONCC036.ID_Empresa = 1
AND CONCC036.ID_Cota = 123456
Bom, como podemos observar, o join não esta sendo feito pelas 3 colunas da foreign key… esta faltando especificar a coluna ID_Empresa, porém ela esta no WHERE, fazendo um filtro por ID_Empresa = 1.
O que podemos concluir com isso, ora, o QO sabe que existe uma foreign key entre as tabelas e sabe quais são as colunas da FK, porque então não utilizar o filtro da tabela CONCC036.ID_Empresa = 1 (WHERE) e também aplicar este filtro na CONCC030.ID_Empresa ?
Com certeza o desenvolvedor que escreveu esta consulta não especificou o ID_Empresa no join justamente porque ele sabia que a coluna seria utilizada no where. Mas isso causou um problema para o QO, pois ele não conseguiu utilizar um índice que temos para fazer o link entre as duas tabelas, já que o índice esta ordenado justamente pela ordem, ID_Empresa, ID_Documento, ID_Tipo_Documento….
O QO poderia muito bem aplicar o filtro em CONCC030.ID_Empresa = 1 e utilizar as outras colunas no join para fazer o filtro…
Outra coisa triste, a funcionalidade que mencionei na WebCast sobre ele descartar as tabelas caso a existência de uma foreign key, só funciona para foreign Keys ligadas por apenas uma coluna… ou seja, se você tiver uma foreign key que liga uma tabela por mais de uma coluna e tentar utilizar a funcionalidade que mencionei, não vai conseguir…
Bom, fica a seguinte dica, ao escrever uma consulta, SEMPRE(does not matter what!) especifique todas as colunas no seu join…
Abraço…
Cuidado com o IF Exists 3
De: Medina, Edvaldo
Enviada em: terça-feira, 27 de outubro de 2009 09:33
Para: Amorim, Fabiano
Assunto: ENC: Cuidado com o IF EXISTS…
Prioridade: Alta
Fabiano, uma pergunta.
Se tivermos um IF com vários EXISTS com AND o SQL vai realizar todas as consultas ou no primeiro que for falso o sistema já finaliza a condição, exemplo:
IF (@B = ‘S’) AND
(EXISTS(SELECT)) AND
(EXISTS(SELECT)) AND
(EXISTS(SELECT)) AND
(@A = ‘S’)
BEGIN
END
———————————————–
De: Amorim, Fabiano
Enviada em: terça-feira, 27 de outubro de 2009 10:11
Para: Medina, Edvaldo
Assunto: RES: Cuidado com o IF EXISTS…
Cara, infelizmente ele vai avaliar todas as consultas, para depois pegar o resultado delas e fazer o IF. Por ex:
DECLARE @A VarChar(1)
SET @A = ‘X’
IF (@A = ‘X’)
AND EXISTS (SELECT 1 FROM CONVE002 WHERE ID_Cota = 1)
AND EXISTS (SELECT 1 FROM CONVE002 WHERE ID_Cota = 2)
AND EXISTS (SELECT 1 FROM CONVE002 WHERE ID_Cota = 3)
AND EXISTS (SELECT 1 FROM CONVE002 WHERE ID_Cota = 4)
AND EXISTS (SELECT 1 FROM CONVE002 WHERE ID_Cota = -1)
BEGIN
SELECT ‘Existe’
END
Ele vai executar todos os selects na CONVE002 guardar o resultado em memória e usar um operador de compute scalar para validar o IF.
Veja no plano de execução, que o operador de compute scalar é o último a ser executado… Não sei não mais acho que o ideal seria ter uma validação para cada consulta…
Cuidado com o IF Exists 2
Pessoal parei para pensar um pouco e aquele loop, virou isso,
CREATE TABLE CONCRAUX (ID Int,
CONSTRAINT XPKCONCRAUX PRIMARY KEY(ID))
GO
DECLARE @I Int
SET @I = 1
WHILE @I < 1000
BEGIN
INSERT INTO CONCRAUX(ID) VALUES(@I);
SET @I = @I + 1
END
GO
SELECT @ID_Grupo,
@CD_Grupo,
CONCRAUX.ID AS CD_Cota,
ISNULL(CONVE046.SN_Utilizada,’N’) AS ST_Reserva
FROM CONCRAUX
LEFT OUTER JOIN CONVE002
ON CONCRAUX.ID = CONVE002.CD_Cota
AND CONVE002.ID_Grupo = @ID_Grupo
AND CONVE002.Versao = 0
LEFT OUTER JOIN CONVE046
ON CONVE046.ID_Grupo = @ID_Grupo
AND CONVE046.CD_Cota = CONCRAUX.ID
AND CONVE046.DT_Validade >= @DT_Base
AND CONVE046.SN_Utilizada = ‘N’
WHERE CONCRAUX.ID <= @NO_Maximo_Cota
AND CONVE002.ID_Cota IS NULL
AND (@ST_Reserva = ‘T’ OR ISNULL(CONVE046.SN_Utilizada,’N’) = @ST_Reserva)
Ou seja, criei uma tabela sequencial, e fiz o join com ela.
Cuidado com o IF EXISTS…
Aqui estou em Buenos Aires trabalhando na otimização de algumas rotinas…. e fica uma dica rápida,
Pessoal quando criarem código SQL, tentem pensar como o banco de dados, por exemplo, cuidado com instruções do tipo:
WHILE @CD_Cota <= @NO_Maximo_Cota
BEGIN
IF NOT EXISTS (SELECT ID_Cota
FROM CONVE002 (NOLOCK)
WHERE CD_Cota = @CD_Cota
AND ID_Grupo = @ID_Grupo
AND Versao = 0)
AND ((@ST_Reserva = ‘T’) OR (dbo.fn_VeSNCotaReservada(@ID_Grupo, @CD_Cota, @DT_Base) = @ST_Reserva))
BEGIN
SET @ST_Reserva_Cota = dbo.fn_VeSNCotaReservada(@ID_Grupo, @CD_Cota, @DT_Base)
INSERT INTO @tb_Reserva (ID_Grupo,
CD_Grupo,
CD_Cota,
ST_Reserva)
VALUES (@ID_Grupo,
@CD_Grupo,
@CD_Cota,
@ST_Reserva_Cota)
END
SET @CD_Cota = @CD_Cota + 1;
END
Ou seja, para validar este IF, o SQL vai terá que ler a tabela CONVE002, depois vai ler o resultado da fn_VeSN… para resolver o EXISTS e depois vai ler denovo a fn_VeSN….
Isso funciona bem quando estamos falando de C# ou Pascal, mas como estamos falando de banco, o Ideal seriamos utilizar várias instruções de IF. Por ex:
WHILE @CD_Cota <= @NO_Maximo_Cota
BEGIN
IF NOT EXISTS (SELECT ID_Cota
FROM CONVE002 (NOLOCK)
WHERE CD_Cota = @CD_Cota
AND ID_Grupo = @ID_Grupo
AND Versao = 0)
BEGIN
IF (@ST_Reserva = ‘T’)
BEGIN
INSERT INTO @tb_Reserva (ID_Grupo,
CD_Grupo,
CD_Cota,
ST_Reserva)
VALUES (@ID_Grupo,
@CD_Grupo,
@CD_Cota,
@ST_Reserva_Cota)
END
ELSE
BEGIN
SET @ST_Reserva_Cota = dbo.fn_VeSNCotaReservada(@ID_Grupo, @CD_Cota, @DT_Base);
IF (@ST_Reserva_Cota = @ST_Reserva)
BEGIN
INSERT INTO @tb_Reserva (ID_Grupo,
CD_Grupo,
CD_Cota,
ST_Reserva)
VALUES (@ID_Grupo,
@CD_Grupo,
@CD_Cota,
@ST_Reserva_Cota)
END
END
END
SET @CD_Cota = @CD_Cota + 1;
END
Ou seja, removemos o disperdicio …
Artigos no ST
Pessoal,
Mais 2 de meus artigos foram publicados no Simple Talk.
Novamente convido a todos para ler e se possível votar ( positivamente é claro 🙂 ).
Seguem os links:
http://www.simple-talk.com/sql/t-sql-programming/data-correlation-optimization-internals/
http://www.simple-talk.com/sql/t-sql-programming/query-optimizer-and-cartesian-products/
Abraço.
SQL Server Day
Pessoal no sábado dia 07/11 teremos um mega evento com 12 horas de SQL Server, vou ministrar a segunda palestra do dia.
Conto com a presença de vocês,
Abraço.
Community Webcast: SQL Server Day – Parte I
09:30 – 10:00 – Abertura do Evento
10:00 – 11:00 – Resource Governor e Policy Management – Vitor Fava e Alexandre Lopes
11:00 – 12:00 – Entenda porque o Query Optimizer é mais esperto que você – Fabiano Amorim
12:00 – 13:00 – SQL Azure Database – Diego Nogare
13:00 – 14:00 – Novos Recursos de Desenvolvimento do SQL Server 2008 – Higor Fernandes
Community Webcast: SQL Server Day – Parte II
14:00 – 15:00 – Compressão de Dados e Backup no Microsoft SQL Server 2008 – Pedro A. G. Junior
15:00 – 16:00 – Entendendo TDE (Transparent Data Encryption) – Felipe Ferreira
16:00 – 17:00 – Entendendo as Common Table Expressions (CTE) – Thiago Zavaschi
17:00 – 18:00 – Powershell Coletando e Analisando os Dados -Laerte Junior e Thiago Zavaschi
18:00 – 19:00 – Solução Avançada de Problemas com Extended Events – Vladimir Magalhães
Community Webcast: SQL Server Day – Parte III
19:00 – 20:00 – Disaster Recovery – Backup, Restore e Tópicos Avançados – Gustavo Maia Aguiar
20:00 – 21:00 – CLR – Roberto Fonseca
21:00 – 22:00 – Analise de Desempenho utilizando as Estatísticas de Espera – Alex Rosa







