Estouro de memória ao fazer Select no SQL Server

Enviada por Lucas Muniz 
Lucas Muniz
Estouro de memória ao fazer Select no SQL Server
06 de October de 2011 às 03:49PM
Boa tarde pessoal.
O caso é o seguinte: estou desenvolvendo uma ferramenta para upload de arquivos. E no MySQL ja está tudo ok. Agora estou testando no SQL Server, e estou me deparando com alguns problemas. Ao inserir o arquivo, tudo bem, nenhum problema, porém, ao tentar dar um select buscando uma linha da tabela, a mensagem de erro retornada é a seguinte:

Fatal error: Out of memory (allocated 1835008) (tried to allocate 4294967295 bytes)


O prepared statment:

$stmt = $SQLConnect->prepare("SELECT * FROM ARQUIVOS WHERE ID_ARQUIVO LIKE ?");
$stmt->bindParam(1, $id);

O caso é: as soluções que vi foram a de aumentar a memoria reservada pro PHP, e isso ja fiz por conta do upload dos arquivos. A questão é: no MySQL funciona, nada de estouro de memória. Ja no SQL Server a mensagem de estouro de memória aparece, o que nao seria possível, pois os arquivos enviados ao banco nao passam de 16mbs e o limite que setei aqui no php.ini é de 256M...

Segue descrição da tabela, caso seja pertinente.

[ID_ARQUIVO] numeric(10) NOT NULL IDENTITY(1,1) ,
[NOME] char(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[DESCRICAO] char(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL ,
[CONTEUDO] varbinary(MAX) NOT NULL ,
[TIPO] char(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL DEFAULT NULL ,
[HASH] binary(64) NOT NULL ,
[TAMANHO] numeric(10) NOT NULL ,
[ID_FILIAL] numeric(10) NOT NULL ,
[ID_CLIENTE] numeric(10) NOT NULL ,
[USUARIO] char(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
CONSTRAINT [PK_ARQUIVO] PRIMARY KEY NONCLUSTERED ([ID_ARQUIVO])


Um outro detalhe, a mesma query executada no MySQL leva 0.104ms em média, enquanto que no SQL Server leva 5.300ms.

Alguém ai pode me ajudar? Ja se depararam com esse tipo de problema?
Marcos Regis
Re: Estouro de memória ao fazer Select no SQL Server
07 de October de 2011 às 09:55AM
Está com cara de que a instrução retornou resultados demais.
Tente trocar a SQL por essa

$stmt = $SQLConnect->prepare("SELECT TOP 40 * FROM ARQUIVOS WHERE ID_ARQUIVO LIKE ?");
Lucas Muniz
Re: Estouro de memória ao fazer Select no SQL Server
07 de October de 2011 às 11:58AM
https://bugs.php.net/bug.php?id=42765
Lucas Muniz
Re: Estouro de memória ao fazer Select no SQL Server
07 de October de 2011 às 12:00PM
Eh um problema com o PDO, é um bug que desde 2007 nao foi corrigido!
Marcos Regis
Re: Estouro de memória ao fazer Select no SQL Server
08 de October de 2011 às 06:21AM
Lucas, você tem razão quanto ao bug existir e ainda não estar solucionado. Ele está ligado ao uso de campos Binary.
No mesmo link onde está o bug tem um patch que pode ser aplicado e que corrige o problema recompilando a extensão (tarefa não muito simples).
Uma saída mais elegante é não manter campos varbinary.
Você pode usar tranquilamente um campo de TEXTO para armazenar o conteúdo da imagem encodada em base64.
Além de ser simples, impede problemas conhecido quando se armazena dados binários em tabelas como a quebra da consulta ou da inserção devido a caracteres nocivos na instrução.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.