2012-02-26 35 views
11

Estoy trabajando con una base de datos Oracle y necesito poder particionar los datos en una tabla. Entiendo que Rracle tiene una función ora_hash que puede dividir los datos en segmentos. ¿Es la función ora_hash determinista?¿Es ora_hash determinista?

En mi programa realizaré varias consultas de bases de datos diferentes con cada consulta pidiendo un número de depósito diferente.

Por ejemplo, en una consulta que podría pedir los dos primeros cubos:

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

En una consulta posterior que podría pedir la segunda y tercera cubeta:

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

En lo anterior ejemplo, ¿ora_hash siempre dividirá la tabla en exactamente los mismos 10 cubos? Supongamos que los datos en las tablas no han cambiado. ¿Será el segundo cubo (casilla 1) idéntico en ambas consultas?

Hay documentación que sugiere que valor de inicialización permite a oráculo devolver resultados diferentes para el mismo conjunto de datos. Por lo tanto, supongo que si no utilizo valor de inicialización, entonces ora_hash será determinista. Ver the documentation.

+0

sólo pude encontrar una referencia a [ "Hash no determinista"] (http://thedailywtf.com/Articles/The-Nondeterministic-Hash.aspx) ... –

Respuesta

5

La respuesta de Jon Heller tiene más detalles, así que sube la respuesta. Dado que esta es la respuesta aceptada todavía, voy a Inline parte de su respuesta:

ORA_HASH es definitivamente determinista para los tipos de datos que pueden ser utilizados para la partición, como NUMBER, VARCHAR, DATE, etc.

Pero ORA_HASH no es determinista para al menos algunos de los otros tipos de datos, como CLOB.

+0

La documentación es correcta! – timmy

13

ORA_HASH es definitivamente determinista para los tipos de datos que pueden ser utilizados para la partición, como el número, VARCHAR, fecha, etc.

Pero ORA_HASH es no determinista para al menos algunos de los otros tipos de datos , como CLOB.


Mi respuesta se basa en this Jonathan Lewis artículo sobre ORA_HASH.

Jonathan Lewis no dice explícitamente que sean deterministas, pero sí menciona que ORA_HASH "parece ser la función utilizada internamente, con un cero inicial, para determinar a qué partición pertenece una fila en una tabla dividida con hash". Y si se usa para particiones hash, entonces debe ser determinista, o de lo contrario las uniones partición no funcionarían.

Para mostrar que ORA_HASH puede ser no determinista para algunos tipos de datos, ejecute la consulta siguiente. Es a partir de un comentario en el mismo artículo:

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; 

Sorprendentemente, este mismo ocurre con los problemas dbms_sqlhash.gethash.

Cuestiones relacionadas