2012-02-26 69 views
11

我正在使用Oracle數據庫,我需要能夠將表​​中的數據分區。我知道Rracle有一個ora_hash函數可以將數據分成桶。 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)是否在兩個查詢中都相同?

有是表明種子值使Oracle爲同一數據集返回不同的結果文檔。所以我假設如果我不使用種子值,那麼ora_hash將是確定性的。請參閱the documentation

+0

我只能找到一個[「非確定性哈希」的引用](http://thedailywtf.com/Articles/The-Nondeterministic-Hash.aspx)... – 2012-02-26 03:53:31

回答

5

Jon Heller的答案有一些更多的細節,所以請提出他的答案。由於這是公認的答案是,我將他的內聯反應的一部分:

ORA_HASH是可以用於數據分區類型絕對確定性,如NUMBERVARCHARDATE

但對於至少某些其他數據類型,例如CLOBORA_HASH不確定。

+0

該文檔是正確的! – timmy 2012-04-04 20:53:50

13

ORA_HASH是針對可用於分區的數據類型,諸如NUMBER,VARCHAR,日期等絕對確定性

但是ORA_HASH不確定性對於至少一些其他數據類型的,如CLOB。


我的答案是基於this喬納森·劉易斯文章關於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發生。

相關問題