Arquivo

Arquivo do Autor

Palestra FAEF – Como foi…

23 de novembro de 2009 Deixe um comentário

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.

Categorias:Não categorizado

NPTEL Courses – Computer Science & Engineering – Database Design

18 de novembro de 2009 Deixe um comentário

É 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 :-).

Database Design

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!

Categorias:Não categorizado

Palestra na FAEF Garça – SP

13 de novembro de 2009 Deixe um comentário

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

Categorias:Não categorizado

Query Optimizer VS Foreign Keys – The answer

12 de novembro de 2009 Deixe um comentário

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.

Categorias:Não categorizado

Query Optimizer VS Foreign Keys

10 de novembro de 2009 Deixe um comentário

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…

Categorias:SQL Server

Cuidado com o IF Exists 3

27 de outubro de 2009 Deixe um comentário

 

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…

clip_image002

Categorias:Não categorizado

Cuidado com o IF Exists 2

26 de outubro de 2009 Deixe um comentário

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.

Categorias:Não categorizado

Cuidado com o IF EXISTS…

26 de outubro de 2009 Deixe um comentário

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 …

Categorias:Não categorizado

Artigos no ST

23 de outubro de 2009 Deixe um comentário

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.

Categorias:Não categorizado

SQL Server Day

19 de outubro de 2009 3 comentários

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

Categorias:Não categorizado