none
OTIMIZAÇÃO DE SELECT RRS feed

  • Pergunta

  •  

    Pessoal,

     

    alguém sabe como melhorar o select abaixo, para que ele fique mais rápido?

     

    Obrigada,

     

    Code Snippet

    select
     sigla_orgven, data_inicio_penreal,
            sum(total_comercial) as total_comercial,
            sum(total_total) as total_total,
     sum(total_total) - sum(total_comercial) as total_operacional
    from
     (select
      sigla_orgven, convert(datetime, convert(char(10), data_inicio_penreal, 103), 103) as data_inicio_penreal,
      (case when  cod_tippenreal_penreal = 3 then 1
      else 0 end) as total_comercial, 1 as total_total
     from pendencia_real
     inner join circuito on cod_cir_penreal = cod_cir
     inner join orgao_vendas on cod_orgven = cod_orgven_cir
     inner join servico s on cod_ser_cir = cod_ser
     where s.descricao_ser like @servico + '%' and
     data_inicio_penreal >= @dtini and
     data_inicio_penreal <= @dtfim
     ) as tab
     group by sigla_orgven, data_inicio_penreal
     order by sigla_orgven, data_inicio_penreal

     

     

    terça-feira, 9 de dezembro de 2008 15:49

Todas as Respostas

  • Vivian,

     

    Esta otimização vai depender basicamente do que você deseja fazer.

     

    Qual é a finalidade deste select?

    terça-feira, 9 de dezembro de 2008 15:58
  • Galvão,

     

    tem a finalidade de listar todas as pendências cadastradas no período, para um determinado
    serviço.

     

    abs,

    terça-feira, 9 de dezembro de 2008 16:09
  • Boa Tarde,

     

    Acredito que há pouco espaço para otimização nesse SELECT. Para otimizá-lo pode ser necessário mais conhecimentos de negócio do que propriamente conhecimentos de SQL Server já que não há muito o que evoluir. O desempenho pode aumentar se um índice for criado sobre data_inicio_penreal e um índice na coluna descricao_ser.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 9 de dezembro de 2008 16:21
  • Maia,

     

    Concordo plenamente, estava pensando um pouco aqui sobre o código, mas basicamente é necessário um melhor entendimento do que esta sendo pretendido para dimensionar uma solução mais performática.

     

    Sobre os índices poderiam ser uma boa solução, acredito que a nossa colega deveria analisar a seletividade de cada coluna para tentar especificar melhor quais colunas poderiam ser consideradas colunas para índice.

    terça-feira, 9 de dezembro de 2008 16:25
  • Oi Jr.

     

    Sim, suas colocações estão corretíssimas. Apenas olhando a estrutura não há nada tão perceptível que leve a uma otimização certa. Acho que no máximo o SELECT pode ser submetido à análise do Index Tuning Wizard ou do Database Tuning Advisor.

     

    [ ]s,

     

    Gustavo

    terça-feira, 9 de dezembro de 2008 16:53
  • Conforme o Maia já falou, certifique-se de que existe um indice nas colunas descricao_ser e data_inicio_penreal.

    Outra coisa é se certificar que o datatype das variáveis @servico, @dtini e @dtfim são do mesmo tipo que as colunas descricao_ser e data_inicio_penreal.

    Só com isso o SQL já deverá passar a utilizar o devido indice, caso mesmo assim o problema persista, sugiro pensar em criar um view indexada.
    terça-feira, 9 de dezembro de 2008 20:04
  • Depois do que o Fabiano falou, eu só adiantaria alguma coisa vendo o plano de execução.

    caso a derivada esteja fazendo o um hash no join e não trabalhe com muitas linhas ,indices nas FK´s se for possível claro ,pode retirar o hash e passar pra um algoritmo melhor, um merge ou loop. Se forem muitas linhas talvez não se aplique..um hash é melhor..mas como eu disse..não opinaria mais do que ja foi dito sem ver o plano de execução.

     

     

    quarta-feira, 10 de dezembro de 2008 00:15