none
Melhorar minha query RRS feed

  • Pergunta

  • Boa tarde,

    De acordo com o meu conhecimento, tive que criar 3 views para chegar ao resultado esperado (no caso uma 3º view), está funcionando normalmente,porém ela está lenta. Existe outra forma de obter o mesmo resultado ?

    Obs.: A tabela Ldrel_Consolidado é um arquivo texto que eu importo mensalmente para o SQL Server, em media a tabela tem 480 Mil registros 

    ------------------------------------------- VIEW 1 (GRUPO1) ---------------------------------------------------

    SELECT     RecNum, CAST(RecNum AS [varchar]) 
                          + ' | ' + cod_resp_anormalidade + ' | ' + cod_local_causa_anormalidade + ' | ' + cod_hw_anormalidade + ' | ' + cod_causa_anormalidade AS Grupo1, 
                          cod_resp_anormalidade, cod_tecnico_executante
    FROM         dbo.Ldrel_Consolidado
    GROUP BY RecNum, CAST(RecNum AS [varchar]) 
                          + ' | ' + cod_resp_anormalidade + ' | ' + cod_local_causa_anormalidade + ' | ' + cod_hw_anormalidade + ' | ' + cod_causa_anormalidade, cod_resp_anormalidade, 
                          cod_tecnico_executante

    ------------------------------------------- VIEW 2 (GRUPO2)---------------------------------------------------

     SELECT     RecNum, CAST(RecNum AS [varchar]) 
                          + ' | ' + cod_resp_causa_anormalidade + ' | ' + cod_local_causa_anormal + ' | ' + cod_tipo_hw_causa_anormalidade + ' | ' + cod_causa_anormal AS GRUPO2, 
                          cod_resp_anormalidade, nome_causa_anormalidade, cod_tecnico_executante
    FROM         dbo.Ldrel_Consolidado
    GROUP BY RecNum, CAST(RecNum AS [varchar]) 
                          + ' | ' + cod_resp_causa_anormalidade + ' | ' + cod_local_causa_anormal + ' | ' + cod_tipo_hw_causa_anormalidade + ' | ' + cod_causa_anormal, 
                          cod_resp_anormalidade, nome_causa_anormalidade, cod_tecnico_executante
    


    ------------------------------------------- VIEW 3 (GRUPO3) ---------------------------------------------------

    SELECT     dbo.GRUPO1.Grupo1, dbo.GRUPO2.GRUPO2, dbo.GRUPO2.nome_causa_anormalidade, dbo.GRUPO2.cod_tecnico_executante
    FROM         dbo.GRUPO2 INNER JOIN
                          dbo.GRUPO1 ON dbo.GRUPO2.GRUPO2 = dbo.GRUPO1.Grupo1
    GROUP BY dbo.GRUPO1.Grupo1, dbo.GRUPO2.GRUPO2, dbo.GRUPO2.nome_causa_anormalidade, dbo.GRUPO2.cod_tecnico_executante


    -------------------------------------------------------

    Em Media a view 3 (GRUPO3) retorna cerca 130 Mil registros


    quinta-feira, 17 de novembro de 2016 15:37

Respostas

  • Bom dia, 

    Obrigado pelo retorno.

    Estava realizando alguns testes e apliquei o argumento MERGE no tipo junção e melhorou a resposta para a minha consulta, via aplicação.

    A view 3 estava demorando certa de  00:1:20 , agora está executando em 24 segundos.

    A frequência de execução será uma vez por semana.

    • Marcado como Resposta Edvaldo A terça-feira, 31 de janeiro de 2017 13:10
    terça-feira, 31 de janeiro de 2017 12:23

Todas as Respostas

  • O problema é o Table Scan que ocorre por causa do seu criterio do Join. Como ele tem como base uma concatenaçao de campos, nao existem indices para auxiliar na busca.

    Outro detalhe, por que voce usa group by se voce nao tem nenhuma funçao de agregaçao (sum, count, etc..)?

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Sugerido como Resposta Junior Galvão - MVPMVP sábado, 19 de novembro de 2016 12:50
    • Não Sugerido como Resposta Edvaldo A terça-feira, 22 de novembro de 2016 11:46
    quinta-feira, 17 de novembro de 2016 15:54
  • Evaldo, e onde a View 1 e View 2 entram? Como elas se relacionam na View 3 que você quer?

    Olhando assim, me parece que o motivo da lentidão está no volume de dados em si (então é bom caprichar no argumento "WHERE" da query para limitar o que você puder) e no "GROUP BY", que consome um recurso maior. Talvez se você não fizer o "GROUP BY" concatenado, mas sim isso:

    VIEW 1

    SELECT     RecNum, CAST(RecNum AS [varchar]) 
                          + ' | ' + cod_resp_anormalidade + ' | ' + cod_local_causa_anormalidade + ' | ' + cod_hw_anormalidade + ' | ' + cod_causa_anormalidade AS Grupo1, 
                          cod_resp_anormalidade, cod_tecnico_executante
    FROM         dbo.Ldrel_Consolidado
    GROUP BY RecNum, cod_resp_anormalidade, cod_local_causa_anormalidade, cod_hw_anormalidade, cod_causa_anormalidade, cod_resp_anormalidade, cod_tecnico_executante

    Entende? Porque o "CAST" no "GROUP BY", mais toda essa concatenação não resulta em um agrupamento diferente, mas sim em um agrupamento por 2 níveis que precisam ser concatenados. Assim é só o valor do campo.

    quinta-feira, 17 de novembro de 2016 15:55
  • Olá aqui vai algumas dicas, outras virão

    1) Como está a definição da sua tabela, 

    2) existe índices ?? pelo meu conhecimento(muito pouco ainda sobre índices) acredito que nesse caso as colunas agrupadas devam ser índices.

    3) alem disso ,vc falou que a VIEW retorna 130 mil registros? mas quem consome esses dados ? a pergunta e  essas suas views tem que retornar esses dados todos ? 



    Wesley Neves


    • Editado Wesley Neves quinta-feira, 17 de novembro de 2016 15:59 complemento
    quinta-feira, 17 de novembro de 2016 15:57
  • William,

    Anteriormente havia colocado um indice no RecNum, porém piorou a perfomance .

    Estou usando o group by pq o objetivo da query é identificar quem encerrou (Técnico) a solicitação, o arquivo que eu recebo, tem aproximadamente 116 colunas e está divido em dados apenas da solicitação (cliente,enderenço, problema, área ... etc) e a outra parte consta os dados de onde a solicitação passou (Áreas) , então uma solicitação pode ter vários itens(máximo 25), pelo fato de ter passado por varias áreas para resolver o problema, ou seja uma unica solicitação pode ter 25 linhas de informações e a view 3 identifica quem encerrou a solicitação, por isto os agrupamentos e concats, desta forma combino informações e descubro o codigo de quem encerrou a mesma. 

    quinta-feira, 17 de novembro de 2016 16:11
  • VIEW 1 =  GRUPO1

    VIEW 2 = GRUPO2

    VIEW 3 = GRUPO3

    O campo RecNum é numérico estava dando erro ao concatenar com outros campos q são texto, então apenas fiz a conversão para texto.

    quinta-feira, 17 de novembro de 2016 16:14
  • William,

    Anteriormente havia colocado um indice no RecNum, porém piorou a perfomance .

    Estou usando o group by pq o objetivo da query é identificar quem encerrou (Técnico) a solicitação, o arquivo que eu recebo, tem aproximadamente 116 colunas e está divido em dados apenas da solicitação (cliente,enderenço, problema, área ... etc) e a outra parte consta os dados de onde a solicitação passou (Áreas) , então uma solicitação pode ter vários itens(máximo 25), pelo fato de ter passado por varias áreas para resolver o problema, ou seja uma unica solicitação pode ter 25 linhas de informações e a view 3 identifica quem encerrou a solicitação, por isto os agrupamentos e concats, desta forma combino informações e descubro o codigo de quem encerrou a mesma. 

    Neste caso use distinct, apesar que nao deve impactar na performance, o codigo fica mais simples.

    Voce pode usar o RecNum para fazer o join entre as duas views?

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 17 de novembro de 2016 16:27
  • Não, pq em algum dos possíveis 25 itens da solicitação há Código de encerramento e como eu comentei o arquivo é divido entre os dados da solicitação 
    (cliente, endereço, problema, area ... etc) e dados técnicos das areas onde a solicitação passou para resolver o problema, quando há fechamento da solicitação pelo sistema (FrontEnd) a causa do problema é refletida para os dados da solicitação e eu combinando algumas colunas 
    eu identifico o código de quem encerrou.

    o resultado é este :

    é realmente deveria ter usado o distinct, mais ainda assim creio q não vai afetar muito na perfomance.
    • Editado Edvaldo A quinta-feira, 17 de novembro de 2016 16:57 .
    quinta-feira, 17 de novembro de 2016 16:45
  • Bom dia Edvaldo A,

    Conseguiu resolver sua dúvida? Se sim, por gentileza, marque como resposta aquela que te ajudou.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 18 de novembro de 2016 11:10
  • Bom dia, 

    Ainda não.

    Para entender melhor o cenário, estou exibindo alguns campos do arquivo texto, veja que trata se do mesmo código (RecNum), a solicitação passou por varias áreas e somente na linha 6 o problema foi solucionado, concatenando as colunas em amarelo e depois criando outra concatenação das colunas em branco(até a coluna cod_causa_anormal), as linhas tornam se iguais e assim descubro quem encerrou o problema e o nome da causa do problema.


    • Editado Edvaldo A sexta-feira, 18 de novembro de 2016 12:09 .
    sexta-feira, 18 de novembro de 2016 11:50
  • Bom Dia,

    Quanto tempo está demorando a view 3?

    Qual a frequencia que ela será executada no seu ambiente?


    Fabrício França Lima MCITP - SQL Server Database Administrator Trabalho com SQL Server desde 2006 Treinamento DBA ONLINE: http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

    terça-feira, 31 de janeiro de 2017 11:23
  • Bom dia, 

    Obrigado pelo retorno.

    Estava realizando alguns testes e apliquei o argumento MERGE no tipo junção e melhorou a resposta para a minha consulta, via aplicação.

    A view 3 estava demorando certa de  00:1:20 , agora está executando em 24 segundos.

    A frequência de execução será uma vez por semana.

    • Marcado como Resposta Edvaldo A terça-feira, 31 de janeiro de 2017 13:10
    terça-feira, 31 de janeiro de 2017 12:23

  • Blz. Uma vez por semana 24 segundos é aceitável visto que a query não tem filtros, compara concatenações e trabalha com meio milhão de registro.




    Fabrício França Lima MCITP - SQL Server Database Administrator Trabalho com SQL Server desde 2006 Treinamento DBA ONLINE: http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

    terça-feira, 31 de janeiro de 2017 12:55