Me gustaría una forma bastante eficiente de condensar una tabla completa en un valor hash.¿Cómo puedo obtener un hash de una tabla completa en postgresql?
Tengo algunas herramientas que generan tablas de datos completas, que luego pueden usarse para generar más tablas, y así sucesivamente. Estoy tratando de implementar un sistema de compilación simplista para coordinar ejecuciones de compilación y evitar repetir el trabajo. Quiero poder registrar hashes de las tablas de entrada para poder verificar luego si han cambiado. Construir una tabla lleva minutos u horas, por lo que es aceptable pasar varios segundos construyendo hash.
Un truco que he utilizado es simplemente canalizar la salida de pg_dump a md5sum, pero eso requiere la transferencia de todo el volcado de tabla a través de la red para hash it en el cuadro local. Idealmente, me gustaría producir el hash en el servidor de la base de datos.
Finding the hash value of a row in postgresql me da una forma de calcular un hash para una fila a la vez, que luego podría combinarse de alguna manera.
Cualquier consejo sería muy apreciado.
Editar para publicar lo que terminé con: La respuesta de tinychen no funcionó para mí directamente, porque no pude usar 'plpgsql' aparentemente. Cuando implementé la función en SQL, funcionó, pero fue muy ineficiente para tablas grandes. Entonces, en lugar de concatenar todos los hash de fila y luego hashing eso, cambié a usar un "hashing rodante", donde el hash anterior se concatena con la representación de texto de una fila y luego se crea un hash para producir el siguiente hash. Esto fue mucho mejor; aparentemente ejecutar md5 en cadenas cortas millones de veces adicionales es mejor que concatenar cadenas cortas millones de veces.
create function zz_concat(text, text) returns text as
'select md5($1 || $2);' language 'sql';
create aggregate zz_hashagg(text) (
sfunc = zz_concat,
stype = text,
initcond = '');
estoy al tanto de ninguna manera de hacer esto. Mi primer instinto sería registrar la creación de la tabla y comparar las marcas de tiempo. – mikerobi
Supongo que no puedes simplemente ejecutar el comando pg_dump en el servidor, ¿verdad? –
@Joey: +1. muy pragmático, probablemente el más rápido. Haz de esto una respuesta. – Thilo