Domanda

Sto lavorando con un database Oracle e devo essere in grado di suddividere i dati in una tabella. Capisco che Rracle ha una funzione ORA_HASH che può partizionare i dati in bucket. La funzione ORA_HASH è deterministica?

Nel mio programma farò diverse query di database con ogni query che chiede un numero di secchio diverso.

Ad esempio, in una query potrei chiedere i primi due secchi:

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

In una domanda successiva potrei chiedere il 2 ° e il terzo secchio:

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

Nell'esempio sopra, ORA_HASH dividerà sempre la tabella negli stessi 10 secchi? Supponiamo che i dati nelle tabelle non siano cambiati. Il secondo secchio (secchio 1) sarà identico in entrambe le domande?

C'è documentazione che lo suggerisce valore del seme Abilita Oracle di restituire risultati diversi per lo stesso set di dati. Quindi presumo che se non uso valore del seme, quindi ORA_HASH sarà deterministico. Vedere la documentazione.

È stato utile?

Soluzione

La risposta di Jon Heller ha alcuni dettagli in più, quindi vota la sua risposta. Dal momento che questa è ancora la risposta accettata, in linea parte della sua risposta:

ORA_HASH è sicuramente deterministico per i tipi di dati che possono essere utilizzati per il partizionamento, come NUMBER, VARCHAR, DATE, eccetera.

Ma ORA_HASH non è deterministico per almeno alcuni degli altri tipi di dati, come CLOB.

Altri suggerimenti

ORA_HASH è sicuramente deterministico per i tipi di dati che possono essere utilizzati per il partizionamento, come numero, varchar, data, ecc.

Ma ORA_HASH è non deterministico per almeno alcuni degli altri tipi di dati, come CLOB.


La mia risposta si basa su questo Articolo di Jonathan Lewis su ORA_HASH.

Jonathan Lewis non dice esplicitamente di essere deterministici, ma lo menziona ORA_HASH "Sembra essere la funzione usata internamente - con un seme zero - per determinare a quale partizione appartiene una riga in una tabella partizionata hash". E se viene utilizzato per il partizionamento di hash, allora deve essere deterministico, altrimenti non funzionerebbero.

Per dimostrarlo ORA_HASH Può essere non deterministico per alcuni tipi di dati, eseguire la query di seguito. È da un commento nello stesso articolo:

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, questi stessi problemi si verificano dbms_sqlhash.gethash.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top