none
Melhorando Consultas! RRS feed

  • Pergunta

  • Olá bom dia!

    Trabalho em um sistema de conteúdo online. Em época de avaliação (Prova), o acesso a estes conteúdos são mais frequentes e acaba sobrecarregando o banco, chegando a ter seu processamento em 100%.

    Eu não entendo porque tem semanas que ele funciona normalmente e chegamos a realizar 10.000 avaliações sem comprometer o processamento do banco. Mas tem semanas que em apenas 600 avaliações o banco abre as pernas

    Uma das consultas que mais é chamada é esta.

    SELECT

        C.IdConteudo[IdConteudo],
        C.Texto[Texto],
        (
            SELECT
                COUNT(E.IdExercicio)
            FROM tbl_Exercicio E WITH(NOLOCK)
            WHERE E.IdConteudo = C.IdConteudo
            AND E.IdStatus = 6
        )[QtdExercicio],
        (
            SELECT
                COUNT(RE.IdExercicio)
            FROM tbl_Exercicio E  WITH(NOLOCK)
                INNER JOIN tbl_RespostaExercicio RE WITH(NOLOCK)
                    ON E.IdExercicio = RE.IdExercicio
                INNER JOIN tbl_Matricula M WITH(NOLOCK)
                    ON RE.IdMatricula = M.IdMatricula
                INNER JOIN tbl_Alternativa A WITH(NOLOCK)
                    ON E.IdExercicio = A.IdExercicio
                    AND RE.RespostaAlternativa = A.Alternativa
            WHERE E.IdConteudo = 5684
            AND E.IdStatus = 6
            AND M.Identificacao = 'AXAXAXP'
            AND M.Ano = 2012
            AND M.Periodo = 2
            AND A.FlagAlternativaCorreta = 1
        )[QtdRespondido]
    FROM tbl_Conteudo C
    WHERE C.IdConteudo = 5684

    Estou tentando monitorar via SqlProfiler e tem umas colunas aqui, são elas:

    EventClass, TextData ApplicationName, NTUserName, LoginName, CPU, Reads, Writes, Duration, ClientProcessID, SPID, StartTime, EndTime, BinaryData, DatabaseId, DatabaseName, EventSequence, GroupID, Handle, HostName, enfim, um monte delas.

    O que me intriga é a coluna Reads que tem o valor de 48270, o que é isto? São leituras  de registros?

    Abraços!


    Alan Santana

    sexta-feira, 16 de novembro de 2012 13:24

Respostas

  • Bom Alan,

    A criação dos indices deveria ser uma trabalho conjunto entre DBA e Desenvolvedor. Você como programador sabe as possiveis maneiras que seu sistema permite fazer as consultas. O DBA analisará as consultas aplicando o que chamamos de tuning, ou seja, fazer com que as queries retornem o mais rápido possivel. Mas nada impede de o proprio programador criar indices...

    Os indices são usados de acordo com a/as chaves de sua consulta. Por exemplo: em uma das consultas voce permite fazer uma busca por nome do produto. Neste caso, sería muito apropriado voce ter um indice com o nome do produto. Porém voce também permite executar outra consulta buscando os produtos pelo fabricante, onde também seria interessante um indice pelo fabricante, entende? Mas isso tudo precisa ser bem analisado, pq nem sempre a criação de indices significa melhora nas consultas. Ah, também existem indices que "cobrem" mais que um tipo de consulta, ou seja, os indices compostos.... etc.

    At.
    Rafael

    quinta-feira, 22 de novembro de 2012 13:58
  • Olá Rafael, desculpa a demora para responder!

    Então, eu fiz uma mudança em meu sistema. Antes eu usava as DLLs (Microsoft.Practices.EnterpriseLibrary...) da microsoft, conheçe? Agora estou usando o nativo do ASP.net (SqlConnection e SqlCommand) e cara, ontem eu tive mais de 20.000 provas processadas e não tive nenhum problema.

    Observação: Fiz esta alteração sem mexer nas consultas!

    Será que era isto?

    Eu tinha a ligeira impressão que essas DLLs seguravam a conexão.

    Att.

    Alan


    Alan Santana

    • Marcado como Resposta Alan Santana segunda-feira, 17 de dezembro de 2012 14:07
    quarta-feira, 28 de novembro de 2012 11:03
  • Olá Rafael, bom dia!

    Então, eu tinha uma certa desconfiança sobre elas, na verdade raramente vejo artigos com elas, por isso eu tinha esse receio de usar, mas como aqui o pessoal sempre usava, então resolvi fazer o mesmo.

    Não mexi nas consultas, tanto porque eu tentei fazer elas da melhor maneira possível. Ontem, por exemplo seria um dia muito complicado, pois era o último dia, e tivemos mais de 30.000 provas rodando e o banco não passou dos 10% de processamento.

    Ainda teremos mais duas etapas de provas e vamos ver o que vai dar.

    Por momento, muito obrigado!

    Alan


    Att. Alan Santana

    • Marcado como Resposta Alan Santana segunda-feira, 17 de dezembro de 2012 14:07
    quinta-feira, 29 de novembro de 2012 13:48

Todas as Respostas

  • Boa tarde Alan,

    Existem muitos fatores que podem influenciar em seu processamento, que dentre eles está a indexação utilizada pela sua consulta. Voce já analisou o plano de execução dessa query? Esse servidor, qual a capacidade de processamento dele? Existem mais databases/aplicações hospedadas nele..??

    Quando ao Reads do profiler, ele refere-se ao número de paginas lógicas lidas durante um evento, ou seja, quanto menor melhor.

    At.
    Rafael

    • Sugerido como Resposta Roberson Naves domingo, 25 de novembro de 2012 13:29
    sexta-feira, 16 de novembro de 2012 18:46
  • Olá Rafael, boa noite!

    Então, eu analisei sim, mas eu não conseguir muita coisa. Cara, este database está em uma única máquina destinada somente para ele, justamente porque ele tem esse comportamento. Ele estava travando outros bancos e por isso resolvemos deixar ele sozinho.

    Quanto ao Reads, não entendi o que vc escreveu... as páginas lógicas são as páginas que os usuários estão acessando simultaneamente?

    Essa consulta que postei, ela fica exatamente em uma página onde todos os usuários acessam e a consulta é dinâmica. e não posso deixa-lá em cache.

    É isto?

    Mas por exemplo, tenho 77500 reads num mesmo segundo e já no outro segundo tenho 55000 e as vezes 700.

    O que é muito para o Reads? e o que são estes números?

    Att.

    Alan


    Alan Santana

    quarta-feira, 21 de novembro de 2012 20:48
  • Bom dia Alan,

    Paginas lógicas refere-se a paginas de dados... que compõe a estrutura interna de um database, que são de 8kb. Então, o "Reads" representa o numero de paginas de 8k lidas quando executada uma determinada query no sql server. Essas paginas são armazenadas em disco, mas no momento da leitura, elas poderão tembém já estar no cache de memória. Caso não esteja, a leitura será feito diretamente no disco mesmo.

    Quando voce diz que a consulta é dinamica, significa que os usuários pode mudar a chave de busca? é isso? Caso sim, voce tem indices que suportam essas leituras?

    at;
    Rafael

    • Sugerido como Resposta Roberson Naves domingo, 25 de novembro de 2012 13:29
    quinta-feira, 22 de novembro de 2012 10:35
  • Olá Rafael, bom dia!

    Isso mesmo, os usuários podem mudar a chave de busca. Como os usuários acessam vários conteúdos, a chave desta consulta pode mudar constantemente.

    Eu estou tentando fazer as minhas consultas em duas etapas, trago metade do que quero e depois tenho um recurso no asp.net que me possibilita re-usar a conexão e daí eu trago a outra metade.

    Rafael, em relação a pergunta: "voce tem indices que suportam essas leituras?", na verdade eu não sei!!! É o DBA que faz estes índices ou eu o programador?

    Cada índice é atrelado a uma uma consulta é isto?

    Por momento,

    Obrigado!


    Alan Santana

    quinta-feira, 22 de novembro de 2012 12:46
  • Bom Alan,

    A criação dos indices deveria ser uma trabalho conjunto entre DBA e Desenvolvedor. Você como programador sabe as possiveis maneiras que seu sistema permite fazer as consultas. O DBA analisará as consultas aplicando o que chamamos de tuning, ou seja, fazer com que as queries retornem o mais rápido possivel. Mas nada impede de o proprio programador criar indices...

    Os indices são usados de acordo com a/as chaves de sua consulta. Por exemplo: em uma das consultas voce permite fazer uma busca por nome do produto. Neste caso, sería muito apropriado voce ter um indice com o nome do produto. Porém voce também permite executar outra consulta buscando os produtos pelo fabricante, onde também seria interessante um indice pelo fabricante, entende? Mas isso tudo precisa ser bem analisado, pq nem sempre a criação de indices significa melhora nas consultas. Ah, também existem indices que "cobrem" mais que um tipo de consulta, ou seja, os indices compostos.... etc.

    At.
    Rafael

    quinta-feira, 22 de novembro de 2012 13:58
  • Olá Rafael, desculpa a demora para responder!

    Então, eu fiz uma mudança em meu sistema. Antes eu usava as DLLs (Microsoft.Practices.EnterpriseLibrary...) da microsoft, conheçe? Agora estou usando o nativo do ASP.net (SqlConnection e SqlCommand) e cara, ontem eu tive mais de 20.000 provas processadas e não tive nenhum problema.

    Observação: Fiz esta alteração sem mexer nas consultas!

    Será que era isto?

    Eu tinha a ligeira impressão que essas DLLs seguravam a conexão.

    Att.

    Alan


    Alan Santana

    • Marcado como Resposta Alan Santana segunda-feira, 17 de dezembro de 2012 14:07
    quarta-feira, 28 de novembro de 2012 11:03
  • Boa tarde Alan,

    Não conheço essas DLL's. Não tenho o conhecimento suficiente para te afirmar se realmente é isso ou não. Bom, esparamos que seja isso mesmo.... Caso contrário terá que analisar melhor suas consultas. É interessante aguardarmos para ter certeza neh? Caso sinta que tenha solucionado o seu problema, marque sua solução como resposta....

    Atenciosamente,
    Rafael

    quarta-feira, 28 de novembro de 2012 17:10
  • Olá Rafael, bom dia!

    Então, eu tinha uma certa desconfiança sobre elas, na verdade raramente vejo artigos com elas, por isso eu tinha esse receio de usar, mas como aqui o pessoal sempre usava, então resolvi fazer o mesmo.

    Não mexi nas consultas, tanto porque eu tentei fazer elas da melhor maneira possível. Ontem, por exemplo seria um dia muito complicado, pois era o último dia, e tivemos mais de 30.000 provas rodando e o banco não passou dos 10% de processamento.

    Ainda teremos mais duas etapas de provas e vamos ver o que vai dar.

    Por momento, muito obrigado!

    Alan


    Att. Alan Santana

    • Marcado como Resposta Alan Santana segunda-feira, 17 de dezembro de 2012 14:07
    quinta-feira, 29 de novembro de 2012 13:48