【发布时间】:2010-10-26 01:19:17
【问题描述】:
我想要一种相当有效的方法来将整个表压缩为一个哈希值。
我有一些工具可以生成整个数据表,然后可以使用这些工具生成更多表,等等。我正在尝试实现一个简单的构建系统来协调构建运行并避免重复工作。我希望能够记录输入表的哈希值,以便稍后检查它们是否已更改。构建一张表需要几分钟或几小时,因此花费几秒钟来构建哈希是可以接受的。
我使用的一个技巧是将 pg_dump 的输出通过管道传输到 md5sum,但这需要通过网络传输整个表转储以在本地机器上散列它。理想情况下,我想在数据库服务器上生成哈希。
Finding the hash value of a row in postgresql 给了我一种方法来一次计算一行的哈希值,然后可以以某种方式组合。
任何提示将不胜感激。
编辑以发布我最终得到的结果: 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 = '');
【问题讨论】:
-
我不知道有什么方法可以做到这一点。我的第一反应是记录表的创建并比较时间戳。
-
我想你不能只在服务器上运行 pg_dump 命令吧?
-
@Joey:+1。非常务实,可能是最快的。将此作为答案。
-
@Joey:好主意,但不,我无法在数据库服务器上运行命令
-
abstime (postgresql.org/docs/8.3/static/contrib-spi.html) 会是一个可能的解决方案吗?这样做的好处是可以原生地适应 Postgre...
标签: sql postgresql hash