none
Trabalhar com muitos milhões de registros, em uma aplicação asp.net RRS feed

  • Pergunta

  • Senhores, Tenho uma dúvida.

    Estou iniciando um projeto em asp.net C#, onde eu vou trabalhar com uma gama muito grande de registros.

    Por exemplo uma consulta de login, pode ser buscada em meio a 1 milhão registros. Fora as ligações dos registros exemplo:

    1 usuário, possui um ticket já pré definido, que pode estar entre 25 milhões de tickets.

    Preciso de algumas dicas de performace e também da melhor forma de construir está aplicação.

    abs,

     


    "conhecimento e fonte"

    segunda-feira, 8 de julho de 2013 01:52

Respostas

  • Isso é bem normal em sistemas de grande porte, vc terá que estruturar bem suas consultas, e uma dica vc pode fazer cache de consultas tb

    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    terça-feira, 9 de julho de 2013 15:27
    Moderador

Todas as Respostas

  • Edison onde vc deve partir inicialmente é em termos de banco, criar índices e normatizar o seu banco, só depois vc testa a sua aplicação, pois se seu banco de dados não estiver normatizado, mesmo com uma quantidade de registros pequenos será lento.


    Junior

    segunda-feira, 8 de julho de 2013 11:14
  • Cara, se você trabalhar com "custom paging" você pode trabalhar até com trocentos milhões de dados que a performance não ficará ruim.  Você faz o comando no próprio sql e deve passar para o comando qual página está buscando e o tamanho de cada página. Por exemplo, você tem uma listagem numa grid com 300000 registros. Cada página dessa grid tem 20 registros. O seu sql normal dará o comando em cima dos 30000 registros e mostrará apenas os 20 primeiros e assim demorá uma eternidade para carregar cada página. No custom paging, o seu comando é apenas em cima do que está buscando, ou seja, nos 20 registros da primeira página, ou da segundo ou terceira e assim por diante. 

    Esse comando retornará o select dado e mais um contador que serve para verificar quantos registros a busca completa possui. Assim, seu select trará a página requisitada, mas você deve saber e mostrar pros usuários quantos registros de fato tem no banco de dados. Você também terá que saber o total, pra assim criar a paginação de sua grid. Vale dizer que, o controle "Object Data Source" dá suporte pra esse tipo de comando. dessa forma ele já fará a paginação automaticamente para você. Você seta os parâmetros e ele passa para o seu comando a página requisitada adequadamente e fará a paginação do resultado total. PS: O Object Data Source não faz o comando, você apenas diz quais sãos os parâmetros respectivos para ele passar para seu comando que você deve criar.

    segue exemplo de implementação em c#, o método possui dois parâmetros que são "pagesize" (tamanho de cada página) e "pagenumber" número da página requisitada (inicia em 0).

        string sqlFiltro = "";
                string sqlPrincipal = "";
                string sqlOrder = "";

                SqlCommand cmd = new SqlCommand();
                SqlCommand cmdCount = new SqlCommand();

                //Quaisquer filtros são passados para esta variável              sqlFiltro += " where idPaciente is not null ";

                //Ordenação é passada para esta variável

                sqlOrder += "order by Nome ";

                // Prepara select principal   

                sqlPrincipal = " SELECT * FROM vw_Paciente WHERE idPaciente IN ";
                sqlPrincipal += " (SELECT TOP(" + pageSize + ") idPaciente FROM vw_Paciente " + sqlFiltro.ToString();
                sqlPrincipal += " and idPaciente NOT IN ";
                sqlPrincipal += " (SELECT TOP(" + pageSize + " * (" + (pageNumber).ToString() + ")) idPaciente FROM               vw_Paciente " + sqlFiltro.ToString() + sqlOrder.ToString() + ") ";
                sqlPrincipal += sqlOrder.ToString() + ") ";
                sqlPrincipal += sqlOrder.ToString() + ";";

                cmd.CommandText = sqlPrincipal;

        //Prepara contador
                cmd.CommandText += " select COUNT(idPaciente) from vw_Paciente ";
                cmd.CommandText += sqlFiltro.ToString() + ";";

        int count = 0;

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        // Ler campos do select principal
                    }

                    if (dr.NextResult())
                    {
                        // Ler contador

                        while (dr.Read())
                           count = dr.GetInt32(0);
                    }
                }

    segunda-feira, 8 de julho de 2013 14:21
  • Junior, e na parte de aplicação oque eu poderia fazer?

    "conhecimento e fonte"

    segunda-feira, 8 de julho de 2013 19:00
  • Certo entendi, só que ainda bem que não terei paginação, mais sim busca de dados específicos no banco de dados.

    Outra coisa que me preocupa e a quantidade de requisições por hora, que pode chegar a 1mil.

     

    "conhecimento e fonte"

    segunda-feira, 8 de julho de 2013 19:01
  • Isso é bem normal em sistemas de grande porte, vc terá que estruturar bem suas consultas, e uma dica vc pode fazer cache de consultas tb

    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    terça-feira, 9 de julho de 2013 15:27
    Moderador