Bonjour,
Les update ligne à ligne, c'est pas terrible effectivement.
Une idée:
J'ai la table TEST suivante:
create table TEST (id primary key,first_name unique,last_name unique)
Je crée une table identique en mélangeant les noms:
1 2 3 4 5 6 7 8 9
| create table SHUFFELED as
select
id
, nvl(lead(first_name)over(partition by part order by ora_hash(first_name)),first_value(first_name)over(partition by part order by ora_hash(first_name))) first_name
, nvl(lead(last_name)over(partition by part order by ora_hash(last_name)),first_value(last_name)over(partition by part order by ora_hash(last_name))) last_name
from (
select /*+ PARALLEL(TEST 8)*/ id,first_name,last_name,ora_hash(first_name) first_name_hash,ora_hash(last_name) last_name_hash,mod(ora_hash(id),8) part from TEST
) order by 1
/ |
Le principe:
- on calcule un hash function pour chaque colonne (avec ora_hash )
- on va trier sur cette colonne et prendre la valeur de l'enregistrement suivant (avec lead. Le nvl et le first_value c'est pour faire un décalage circulaire... il y a peut-être mieux)
- pour profiter du parallélisme, je fais de paquets avec modulo 8
Cordialement,
Franck
Partager