c-postgres为PARTITION by HASH使用了什么哈希算法/函数



在postgres中,有一个基于hash的分区。但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负载。

最新更新