Optimiser INSERT sur table cible contenant un INDEX UNIQUE
Bonjour,
J'ai hérité d'une base, je suis en train d'essayer de faire quelques tests afin d'optimiser des chargements. Je découvre Oracle et pour le moment je n'ai pas les droits pour exécuter les plans de requêtes.
J'ai donc une table A contenant un index unique sur 3 champs, cette table est alimentée, selon le besoin, par des utilisateurs chargeant des lots de 6 millions de lignes. Ce chargement prend plus de 6 minutes. La table source n'est pas indexée, c'est une table externe (on l’appellera table B).
Ajouter un hint APPEND au chargement augmente les performances, on passe à 3"30 environ. J'ai tenté également de remplacer l'index unique par un index simple et d'effectuer un :
Code:
1 2 3 4 5 6 7 8 9
|
INSERT INTO TABLE_A A
SELECT * FROM TABLE_B
WHERE NOT EXISTS (
SELECT 1 FROM TABLE_A
WHERE A.COLONNE1 = COLONNE1
AND A.COLONNE2 = COLONNE2
AND A.COLONNE3 = COLONNE3
) |
Les performances sont sensiblement identiques à celles où il y a l'index unique, soit 6 minutes environ. Je sèche un peu...
Auriez-vous une idée sur la manière d'optimiser ce type de chargement et voir (lorsque j'aurai les droits...) comment voir où les perfs ne sont pas bonnes ? Par ailleurs je suis dans un cas de figure où les fichiers sources sont sur le réseau (et non sur le serveur local Oracle) et où je ne connais pas l'architecture matérielle, auriez-vous également une idée sur la manière dont on peut "auditer" l'implication du réseau et matériel dans les perfs ? Vous l'aurez compris, le cas de figure de devoir prendre en compte l'architecture est nouveau pour moi :D
En vous remerciant,
C. Tobini