我想要一种相当有效的方法将整个表压缩为哈希值.
我有一些工具可以生成整个数据表,然后可以用来生成更多的表,等等.我试图实现一个简单的构建系统来协调构建运行并避免重复工作.我希望能够记录输入表的哈希值,以便以后判断它们是否已更改.构建一个表需要几分钟或几小时,所以花几秒钟构建哈希是可以接受的.
我使用的一种方法是将pg_dump的输出通过管道传输到md5sum,但这需要通过网络传输整个表转储,以便将其散列到本地框中.理想情况下,我希望在数据库服务器上生成哈希.
Finding the hash value of a row in postgresql给了我一种每次计算一行的哈希值的方法,然后可以以某种方式进行组合.
任何提示都将不胜感激.
Edit to post what I ended up with: tinychen的答案对我来说并不直接有效,因为我显然不能使用"plpgsql".当我在SQL中实现该函数时,它工作正常,但对于大型表来说效率非常低.因此,我没有将所有行哈希连接起来,然后对其进行哈希,而是转而使用"滚动哈希",将前一个哈希与行的文本表示连接起来,然后对其进行哈希以生成下一个哈希.这样好多了;显然,在短字符串上额外运行数百万次md5比将短字符串连接数百万次要好.
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 = '');