¿Hay problemas de rendimiento al almacenar archivos en PostgreSQL? [cerrado]


¿Está bien almacenar archivos como páginas HTML, imágenes, PDF, etc. en una tabla en PostgreSQL o es lento? He leído algunos artículos diciendo que esto no es recomendable, pero no se si es cierto.

Y lo que es mejor usar, almacenar como BLOB (se almacena en un archivo, ¿verdad?) o en una columna con el tipo bytea?

Author: Renato Dinhani, 2012-03-07

2 answers

Básicamente tienes dos opciones. Puede almacenar los datos directamente en la fila o puede usar la instalación de objetos grandes. Dado que PostgreSQL ahora usa algo llamado TOAST para mover campos grandes fuera de la tabla, no debería haber ninguna penalización de rendimiento asociada con el almacenamiento de datos grandes en la fila directamente. Queda un límite de 1 GB en el tamaño de un campo. Si esto es demasiado limitado o si desea una API de transmisión, puede usar la instalación de objetos grandes, que le brinda algo más parecido a un archivo descriptores en la base de datos. Almacena el ID de LO en su columna y puede leer y escribir desde ese ID.

Personalmente le sugeriría que evite la instalación de objetos grandes a menos que lo necesite absolutamente. Con TOAST, la mayoría de los casos de uso están cubiertos simplemente usando la base de datos de la manera que esperaría. Con objetos grandes, usted se da una carga de mantenimiento adicional, porque usted tiene que llevar un registro de los LO IDs que ha utilizado y asegúrese de desvincularlos cuando ya no se utilizan (pero no antes) o se sentarán en tu directorio de datos ocupando espacio para siempre. También hay una gran cantidad de instalaciones que tienen un comportamiento excepcional a su alrededor, los detalles de los cuales se me escapan porque nunca los uso.

Para la mayoría de las personas, la gran penalización de rendimiento asociada con el almacenamiento de grandes datos en la base de datos es que su software OR extraerá los grandes datos en cada consulta a menos que le indique específicamente que no lo haga. Debes tener cuidado de decirle a Hibernar o lo que sea que estés usando para tratar estos columnas tan grandes y solo las recuperan cuando se solicitan específicamente.

 42
Author: Daniel Lyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-07 17:29:43

El tipo BLOB (LO) almacena datos en trozos de 2KB dentro de las páginas de montón estándar de PostgreSQL que tienen un tamaño predeterminado de 8KB. No se almacenan como archivos independientes y cohesivos en el sistema de archivos - por ejemplo, no sería capaz de localizar el archivo, hacer una comparación byte-by-byte y esperar que sea el mismo que los datos del archivo original que cargó en la base de datos, ya que también hay encabezados de página de montón de Postgres y estructuras que delinean los trozos.

Usted debe evitar el uso de la Gran Object (LO) interface si su aplicación necesita actualizar con frecuencia los datos binarios, y particularmente si eso implica una gran cantidad de pequeñas escrituras de acceso aleatorio, lo que debido a la forma en que PostgreSQL implementa el control de concurrencia (MVCC) puede conducir a una explosión en la cantidad de espacio en disco utilizado hasta que VACÍE la base de datos. El mismo resultado es probablemente también aplicable a los datos almacenados en línea en una columna con el tipo bytea o incluso TOAST'd.

Sin embargo, si sus datos siguen una Patrón de escritura-Una-lectura-muchos (por ejemplo, cargar una imagen PNG y nunca modificarla después), debería estar bien desde el punto de vista del uso del disco.

Vea este hilo de la lista de correo pgsql-general para más discusión.

 8
Author: singularsyntax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-21 00:16:22