Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Massa de Dados

Boa noite, estou assistindo as aulas do Linq que por sinal está me ajudando muito, estava utilizando muitos "includes" onde cada lista retorna o objeto completo fazendo com que o sistema ficasse muito lento.

Após alteração com as dicas do treinamento melhorou absurdamente a performance.

Tenho uma duvida, existe algum limite de registros? Posso trabalhar com milhões?

Obrigado

5 respostas

Olá, Fábio! Obrigado pela mensagem, é muito gratificante saber que o curso está sendo útil pra você! Realmente é para isso que trabalhamos.

Sobre o limite de registros: se estamos falando de banco de dados relacional (SQL Server), se estamos preocupados com performance e volume de dados, devemos sempre monitorar as consultas SQL geradas, conforme vimos no curso. É fundamental, para resolver problemas de performance, "atacar" as consultas mais relevantes, e interpretá-las e talvez ajustá-las para que elas tenham um bom desempenho. O bom desempenho de uma consulta LINQ to Entities começa no banco de dados: as tabelas devem ter índices onde eles precisam existir, e ao mesmo tempo não devemos utilizar índices onde eles foram supérfluos, pois isso penaliza as consultas e diminui a performance. Também devemos trazer do banco de dados somente os dados necessários (para evitar o famigerado "SELECT * FROM..."). Enfim, muitas vezes para termos alto desempenho no LINQ to Entities precisamos primeiro conhecer bem os fundamentos do SQL Server, que é a parte mais crítica do processo.

Sobre "trabalhar com milhões de registros": veja que não é uma boa ideia "trazer" do banco de dados para a memória esses milhões de registros através do LINQ. Mas se você está falando em ter um banco de dados com milhões de registros e consultá-lo através do LINQ para trazer pequenos conjuntos de dados, isso é perfeitamente possível e até comum de se fazer. A questão é: suas consultas SQL estão adequadas? As tabelas tem índices? Você está fazendo uma combinação de filtros em tabelas com índices que cobrem esse conjunto de filtros? Se você precisa, por exemplo, utilizar um filtro WHERE com LIKE "%SOBRENOME%", aí realmente complica, porque os índices não vão te ajudar. Nesse caso é necessário usar uma estratégia Full Text Search, que não abordamos no curso, porque foge do tópico.

Resumindo: LINQ ajuda bastante mas não faz milagre. O banco de dados (com uma boa modelagem) tem que fazer a parte dele primeiro.

Ah, e se ainda não fez, recomendamos os cursos de SQL Server da Alura:

https://www.alura.com.br/curso-online-sqlserver

https://www.alura.com.br/curso-online-sqlserver-2

Boa sorte e bons estudos!

Perfeito, muito obrigado pela resposta rápida e bem explicativa.

Entendo que existe mais recursos alem do Linq, já fiz o curso de SQL um tempo atrás, vou relembrar alguns tópicos com do Alura.

Fábio

Olá, veja um exemplo em minha Query, nessa tabela tenho 44 mil registros, quando faço a busca pelo nome do cliente ele demora, teria alguma sugestão?

Vejo que a questão da demora está relacionado ao Contains, pois quando tiro ele retorna os dados bem rapidos.

var queryProposta =

                       from proposta in context.Proposta
                       where proposta.EmpresaID == empresaID
                       join cliente in context.ClienteFornecedor on proposta.ClienteID equals cliente.ID
                       orderby cliente.NomeRazaoSocial
                       ascending
                       where cliente.NomeRazaoSocial.Contains(pesquisa) 
                       join consultor in context.Colaborador on proposta.ColaboradorID equals consultor.ID

                       orderby proposta.Numero
                       descending

                       select new
                       {
                           ID = proposta.ID,
                           Numero = proposta.Numero,
                           NomeRazaoSocial = cliente.NomeRazaoSocial,
                           NomeFantasia = cliente.NomeFantasia,
                           Consultor = consultor.Apelido,
                           DataInicio = proposta.DataInicio,
                           DataFim = proposta.DataFim,
                           Total = proposta.Total,
                           Status = proposta.StatusProposta
                       };

                return queryProposta.Skip((pagina - 1) * registros).Take(registros + 1).ToList();
solução!
var queryProposta =

                       from proposta in context.Proposta
                       where proposta.EmpresaID == empresaID
                       join cliente in context.ClienteFornecedor on proposta.ClienteID equals cliente.ID
                       orderby cliente.NomeRazaoSocial
                       ascending
                       where cliente.NomeRazaoSocial.Contains(pesquisa)
                       join consultor in context.Colaborador on proposta.ColaboradorID equals consultor.ID

                       orderby proposta.Numero
                       descending

                       select new
                       {
                           ID = proposta.ID,
                           Numero = proposta.Numero,
                           NomeRazaoSocial = cliente.NomeRazaoSocial,
                           NomeFantasia = cliente.NomeFantasia,
                           Consultor = consultor.Apelido,
                           DataInicio = proposta.DataInicio,
                           DataFim = proposta.DataFim,
                           Total = proposta.Total,
                           Status = proposta.StatusProposta
                       };

                return queryProposta.Skip((pagina - 1) * registros).Take(registros + 1).ToList();

Cliquei em Solução sem querer. Aguardo retorno