Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

GustavoTSouza

Erro fetchAll(PDO::FETCH_ASSOC)

Recommended Posts

Senhores,

 

Estou implementando uma pesquisa de produtos em PDO e me deparei com o seguinte problema:

Quando a query sql retornava muitos resultados o processo parava e ficava em tela branca após executar o fetchAll(PDO::FETCH_ASSOC).

 

-)A query era basicamente "SELECT * FROM produtos WHERE ...." (retorno 3000 resgistros)

 

Depois de algumas tentativas mudando a query para:

 

-) "SELECT id,nome FROM produtos WHERE ...."

 

A pesquisa funcionou em todos os casos novamente.

 

Só para esclarecer a query sempre estava correta pois o método execute() retornava true.

A tabela produtos tem cerca de 60 colunas entre elas algumas do tipo text que permitem conteúdo HTML.

 

Não tenho muita experiência com PDO, consegui resolver o problema emergencial porém gostaria de saber qual foi o motivo do problema.

 

Dúvida:

Existe alguma limitação do PDO quanto a isso? Talvez do PHP ao transformar em array?Como contornar o erro?

 

Obrigado desde já,

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que o PDO nao tenha limite de quantos registros podem ser retornados na tabela. como voce mesmo disse que a tabela retorna 60 colunas x 3000 mil, acredito que o tempo de processamento fique um pouco mais lento, voce resolveu isso puxando somente 'id,nome' o que vale a 2 colunas x 3000 mil, o que torna o tempo de processamento um pouco mais rapido do que anteriormente, outra coisa que diminui o tempo de processamento é a transformação em um array, a cada vetor mais um espaço na memoria do servidor é alocado, imagina alocar na memoria 60 x 3000, o que diminui bastante o tempo de processamento.

 

Acredito que voce deva encontrar uma forma de otimizar este codigo, siga abaixo algumas dicas:

 

  • Quais serão os campos necessarios que deverão ser retornados?
  • 60 Colunas na tabela é um grande motivo de preocupações, porque voce nao tenta fragmentar esta tabela em outras tabelas?

 

Tudo bem que voce ate pode comprar um servidor dedicado para realizar este tipo de coisa, mas acredito que nao vale a pena, nos profissionais de TI, temos em mente que:

 

  • O trabalho deve ser pratico, simples, eficiente, eficaz e de baixo custo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Micilini Roll

A consulta que estava travando era apenas referente a paginação da pesquisa, portanto troquei o * por apenas id. Resolvendo o problema crítico.

 

As questões preocupantes a respeito das 60 colunas não estou fazendo nenhuma query que chame todas as colunas, está otimizado utilizando apenas os campos que irei precisar.Apenas coloquei a informação para todos terem noção de quanto precisa para gerar o erro, não é algo comum de precisar de tantos dados.

 

@tópico

A questão principal que quero colocar é descobrir qual o problema que ocorreu em um teste de query muito pesada (provocada, no caso, por um erro de otimização na programação) .

 

Apesar do erro, até a parte do execute() mesmo com todos os campos na query o processamento se saiu melhor que o esperado.O problema ocorreu somente no fetchAll(PDO::FETCH_ASSOC). Será possível o resultado 60x 3000 ter alcançado o limite de memória 64M? (acredito que não). Qual outro limite ele pode ter alcançado no PHP para travar?

 

Estou investigando mais a fundo o motivo desse erro, pois estaremos logo implementando o PDO em todo o sistema. Portanto preciso o máximo de informações e limitações possível sobre para fazer a análise dessa modificação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

fetchAll () puxa todos os registros de sua tabela e despeja o lote para a memória de uma só vez ... agora, usando SELECT * ... significa que você está puxando todas as 60 colunas fora por registro (e é um pouco menos eficiente no servidor SQL, de qualquer maneira de fornecer os nomes das colunas como o servidor tem que descobrir o que eles estão em primeiro lugar). Se você está apenas especificando 2 colunas, você irá despejar muito menos dados na memória, é claro as probabilidades são:

 

  • PHP foi a falta de memória allocatable permitido quando usando SELECT *.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.