Oracle
 sql >> Base de données >  >> RDS >> Oracle

Ora_hash est-il déterministe ?

ORA_HASH est définitivement déterministe pour les types de données pouvant être utilisés pour le partitionnement, tels que NUMBER, VARCHAR, DATE, etc.

Mais ORA_HASH n'est pas déterministe pour au moins certains des autres types de données, tels que CLOB.

Ma réponse est basée sur ceci Article de Jonathan Lewis sur ORA_HASH .

Jonathan Lewis ne dit pas explicitement qu'ils sont déterministes, mais il mentionne que ORA_HASH "semble être la fonction utilisée en interne - avec une graine nulle - pour déterminer à quelle partition appartient une ligne dans une table partitionnée par hachage". Et s'il est utilisé pour le partitionnement par hachage, il doit être déterministe, sinon les jointures par partition ne fonctionneraient pas.

Pour montrer que ORA_HASH peut être non déterministe pour certains types de données, exécutez la requête ci-dessous. C'est tiré d'un commentaire dans le même article :

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;

Étonnamment, ce même problème se produit avec dbms_sqlhash.gethash .