Question

Je travaille avec une base de données Oracle et je dois pouvoir partitionner les données dans une table.Je comprends que Rracle dispose d'une fonction ora_hash qui peut partitionner les données en compartiments.La fonction ora_hash est-elle déterministe ?

Dans mon programme, je ferai plusieurs requêtes de base de données différentes, chaque requête demandant un numéro de compartiment différent.

Par exemple, dans une requête, je pourrais demander les deux premiers compartiments :

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

Dans une requête ultérieure, je pourrais demander les 2e et 3e compartiments :

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

Dans l'exemple ci-dessus, ora_hash divisera-t-il toujours la table en exactement les mêmes 10 compartiments ?Supposons que les données des tableaux n'ont pas changé.Le deuxième bucket (bucket 1) sera-t-il identique dans les deux requêtes ?

Il existe des documents qui suggèrent que valeur de départ permet à Oracle de renvoyer des résultats différents pour le même ensemble de données.Donc je suppose que si je n'utilise pas valeur de départ, alors ora_hash sera déterministe.Voir La documentation.

Était-ce utile?

La solution

La réponse de Jon Heller contient plus de détails, alors votez pour sa réponse.Puisqu'il s'agit toujours de la réponse acceptée, j'intégrerai une partie de sa réponse :

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.

Autres conseils

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 est pas déterministe pour au moins certains des autres types de données, tels que CLOB.


Ma réponse est basée sur ce 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 valeur de départ 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.

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, les mêmes problèmes se produisent avec dbms_sqlhash.gethash.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top