我正在使用Oracle数据库,我需要能够在表中对数据进行分区.据我所知,Rracle有一个ora_hash函数,可以将数据分区为桶.ora_hash函数是否确定?
在我的程序中,我将进行几个不同的数据库查询,每个查询都要求一个不同的桶号.
例如,在一个查询中,我可能会要求前两个桶:
SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (0,1);
Run Code Online (Sandbox Code Playgroud)
在随后的查询中,我可能会要求第2和第3个桶:
SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (1,2);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,ora_hash是否总是将表分成完全相同的10个桶?假设表中的数据没有改变.第二个桶(桶1)在两个查询中是否相同?
有文档表明,种子值使oracle能够为同一数据集返回不同的结果.所以我假设如果我不使用种子值,那么ora_hash将是确定性的.请参阅文档.
Jon*_*ler 16
ORA_HASH
绝对是可用于分区的数据类型的确定性,例如NUMBER,VARCHAR,DATE等.
但是,ORA_HASH
是不是确定性的至少一些其他数据类型,如CLOB.
我的答案是基于这个乔纳森·刘易斯的文章有关ORA_HASH
.
Jonathan Lewis没有明确表示它们是确定性的,但他确实提到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;
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,同样的问题也随之发生dbms_sqlhash.gethash
.
Jon Heller的回答有更多细节,所以请回答他的回答.由于这仍然是公认的答案,我将在其中回答部分内容:
ORA_HASH
为可以使用的用于划分的数据类型,诸如绝对确定性NUMBER
,VARCHAR
,DATE
等.但
ORA_HASH
对于至少一些其他数据类型,例如,不是确定性的CLOB
.
归档时间: |
|
查看次数: |
9490 次 |
最近记录: |