【问题标题】:Is ora_hash deterministic?ora_hash 是确定性的吗?
【发布时间】:2012-02-26 03:48:33
【问题描述】:

我正在使用 Oracle 数据库,我需要能够对表中的数据进行分区。我知道 Rracle 有一个 ora_hash 函数,可以将数据分区到桶中。 ora_hash 函数是确定性的吗?

在我的程序中,我将进行几个不同的数据库查询,每个查询都要求不同的存储桶号。

例如,在一个查询中,我可能会要求前两个存储桶:

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (0,1);

在随后的查询中,我可能会要求第二个和第三个存储桶:

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (1,2);

在上面的例子中,ora_hash 是否总是将表分成完全相同的 10 个桶?假设表中的数据没有改变。第二个存储桶(存储桶 1)在两个查询中是否相同?

有文档表明 seed value 使 oracle 能够为同一数据集返回不同的结果。所以我假设如果我不使用 seed value,那么 ora_hash 将是确定性的。见the documentation

【问题讨论】:

标签: oracle ora-hash


【解决方案1】:

ORA_HASH对于可用于分区的数据类型绝对是确定性的,例如NUMBER、VARCHAR、DATE等。

ORA_HASH 对于至少某些其他数据类型(例如 CLOB)不是确定性的。


我的回答基于this Jonathan Lewis 关于ORA_HASH 的文章。

乔纳森刘易斯没有明确说它们是确定性的,但他确实提到ORA_HASH“似乎是内部使用的函数 - 种子为零 - 以确定行属于哈希分区表中的哪个分区” .如果它用于哈希分区,那么它必须是确定性的,否则分区连接将不起作用。

要显示ORA_HASH 对于某些数据类型可能是不确定的,请运行以下查询。来自同一篇文章的评论:

with src as (select to_clob('42') val from dual connect by level<=5)
select val,ora_hash(val,7) from src order by 2;

令人惊讶的是,dbms_sqlhash.gethash 也会出现同样的问题。

【讨论】:

    【解决方案2】:

    Jon Heller 的回答有更多细节,所以请投票支持他的回答。由于这仍然是公认的答案,我将内联他的部分回复:

    ORA_HASH对于可用于分区的数据类型绝对是确定性的,例如NUMBERVARCHARDATE等。

    ORA_HASH 至少对于某些其他数据类型(例如CLOB)来说是不确定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2012-05-13
      • 2016-10-20
      • 1970-01-01
      • 2016-05-12
      • 2021-05-26
      相关资源
      最近更新 更多