在postgres中,有一个基于的分区hash
. But postgres
没有清楚地解释如何计算给定列值的哈希值。
我搜索了 Postgres 文档,但一无所获。除了一些邮箱帖子里,还有人提到hashtext()
内部功能。有谁有关于用于散列值的实际函数(以及进一步使用模运算符)的任何信息吗?我的意思是 postgres 如何散列一个值,将其转换为uint64
到最后的模运算。
更新:
阅读 postgres 源代码,我发现分区函数在尝试查找一个分区时使用了这样的方法uint64
给定哈希值:
/*
* DatumGetUInt64
* Returns 64-bit unsigned integer value of a datum.
*
* Note: this macro hides whether int64 is pass by value or by reference.
*/
#ifdef USE_FLOAT8_BYVAL
#define DatumGetUInt64(X) ((uint64) (X))
#else
#define DatumGetUInt64(X) (* ((uint64 *) DatumGetPointer(X)))
#endif
使用的哈希函数是哈希索引运算符系列的支持函数。您可以在以下位置找到它们pg_amproc系统目录;加入与pg_opfamily
并将查询限制为运算符系列hash
访问方法
此查询列出了每种类型的标准哈希支持函数:
SELECT DISTINCT
ap.amproclefttype::regtype AS data_type,
ap.amproc::regproc AS hash_function
FROM pg_amproc AS ap
JOIN pg_opfamily AS of ON ap.amprocfamily = of.oid
JOIN pg_am ON of.opfmethod = pg_am.oid
WHERE pg_am.amname = 'hash'
AND ap.amprocnum = 1
ORDER BY amproclefttype::regtype::text;
该功能应该是无关紧要的,但我理解你的好奇心。
请注意,除非您将分区放在不同的存储上以分散 I/O 负载,否则哈希分区几乎没有任何用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)