2011-01-10 30 views
11

Inicié una aplicación con Hibernate 3.2 y PostgreSQL 8.4. Tengo algunos byte[] campos que se mapearon como @Basic (= PG bytea) y otros que se mapearon como @Lob (= PG Large Object). ¿Por qué la inconsistencia? Porque era un novato de Hibernate.PostgreSQL: BYTEA vs OID + ¿Objeto grande?

Ahora, esos campos tienen un máximo de 4 Kb (pero el promedio es de 2-3 kb). La documentación de PostgreSQL mencionaba que los OA son buenos cuando los campos son grandes, pero no vi lo que significaba "grande".

He actualizado a PostgreSQL 9.0 con Hibernate 3.6 y estaba atascado para cambiar la anotación a @Type(type="org.hibernate.type.PrimitiveByteArrayBlobType"). Este error ha provocado un posible problema de compatibilidad, y finalmente descubrí que los objetos grandes son difíciles de manejar, en comparación con un campo normal.

Así que estoy pensando en cambiarlo a bytea. Pero me preocupa que los campos bytea estén codificados en hexadecimal, por lo que hay cierta sobrecarga en la codificación y decodificación, y esto dañaría el rendimiento.

¿Hay buenos puntos de referencia sobre el rendimiento de ambos? ¿Alguien ha hecho el cambio y ha notado la diferencia?

Respuesta

5

Básicamente hay casos en los que cada uno tiene sentido. bytea es más simple y generalmente preferido. Las bibliotecas de cliente le dan la decodificación para que no sea un problema.

Sin embargo, los LOB tienen algunas características interesantes, como la capacidad de buscar dentro de ellos y tratar el LOB como un flujo de bytes en lugar de una matriz de bytes.

"Grande" significa "lo suficientemente grande que no desea enviarlo al cliente de una vez". Técnicamente, bytea está limitado a 1 GB comprimido y un globo está limitado a 2 GB comprimidos, pero en realidad uno toca el otro límite de todos modos. Si es lo suficientemente grande como para no quererlo directamente en su conjunto de resultados y no desea enviarlo al cliente de una vez, use un LOB.

4

Pero me preocupa que bytea campos están codificados en hexadecimal

entrada bytea puede estar en hexadecimal o escape formato, que es su elección. El almacenamiento será el mismo. A partir de la versión 9.0, el valor predeterminado de salida es hexadecimal, pero puede cambiar esto editando el parámetro bytea_output.

No he visto ningún punto de referencia.

+0

También no se almacena como hexadecimal, y creo que libpq (y tal vez incluso el protocolo) tiene una interfaz para las transferencias binarias de ambos. –

1

No tengo una comparación de objetos grandes y bytea útil, pero tenga en cuenta que el cambio al formato de salida hexadecimal en 9.0 también se realizó porque es más rápido que la codificación personalizada anterior. En lo que respecta a la codificación de texto de datos binarios, probablemente no obtendrá mucho más rápido de lo que actualmente es.

Si eso no es suficiente para usted, puede considerar el uso del protocolo binario entre el cliente y el servidor de PostgreSQL. Entonces básicamente obtienes las cosas directamente del disco, al igual que los objetos grandes. No sé si PostgreSQL JDBC lo admite aún, pero una búsqueda rápida sugiere que no.

Cuestiones relacionadas