我正在使用Oracle数据库,我需要能够在表中对数据进行分区。据我所知,Rracle有一个ora_hash函数,可以将数据分区为桶。 ora_hash函数是否确定?
在我的程序中,我将针对每个查询进行几个不同的数据库查询,询问不同的桶号。
例如,在一个查询中,我可能会要求前两个桶:
SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (0,1);
在随后的查询中,我可能会要求第2和第3个桶:
SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (1,2);
在上面的示例中,ora_hash是否总是将表分成完全相同的10个桶?假设表中的数据没有改变。第二个桶(桶1)在两个查询中都是相同的吗?
有文档表明种子值使oracle能够为同一数据集返回不同的结果。所以我假设如果我不使用种子值,那么ora_hash将是确定性的。请参阅the documentation。
答案 0 :(得分:16)
ORA_HASH
肯定是确定性的,例如NUMBER,VARCHAR,DATE等。
但至少某些其他数据类型(例如CLOB)的ORA_HASH
不确定性。
我的回答是基于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
。
答案 1 :(得分:5)
对于可用于分区的数据类型,
ORA_HASH
肯定是确定性的,例如NUMBER
,VARCHAR
,DATE
等。但
ORA_HASH
至少对其他一些数据类型不具有确定性,例如CLOB
。