Pour résumer les détails: nous devons regrouper environ 5 millions de lignes dans une base de données fournisseur (Oracle). Tout va très bien pour les lots de 500 000 lignes utilisant OracleBulkCopy
(ODP.NET), mais lorsque nous essayons de passer à 5 Mo, les performances commencent à ralentir à une analyse une fois qu'elles atteignent la marque 1 Mo, deviennent progressivement plus lentes à mesure que davantage de lignes sont chargées, et finalement expire après environ 3 heures.
Je pense qu'il est lié à une clé primaire sur la table, mais je l' ai été chalutait les forums de débordement Oracle et Stack pour informations et beaucoup de ce que je lis que contredit (aussi, beaucoup de messages semblent contredire les uns les autres ) . J'espère que quelqu'un pourra remettre les pendules à l'heure sur des questions étroitement liées au processus:
La
OracleBulkCopy
classe utilise-t-elle un chargement conventionnel ou direct? Existe-t-il un moyen de confirmer cela, d'une manière ou d'une autre?En supposant qu'il ne use-chemin direct chargement: Est - il vrai que Oracle définit automatiquement tous les index à inutilisable pendant la charge et met en ligne les récupérer par la suite? J'ai lu plusieurs déclarations à cet effet, mais encore une fois, je ne peux pas le confirmer.
Si # 2 est vrai, cela devrait-il faire une différence quels sont les index sur la table avant de lancer une opération de copie en bloc? Si oui, pourquoi?
En ce qui concerne le n ° 3, existe-t-il une différence pratique, en général, entre le chargement en bloc avec un index inutilisable et le fait de supprimer l'index avant le chargement et de le recréer ensuite?
Si # 2 n'est pas correct, ou s'il y a des mises en garde que je ne comprends pas, cela ferait-il une différence de rendre explicitement l'index inutilisable avant le chargement en bloc, puis de le reconstruire explicitement après?
Y a-t-il autre chose, autre que des générations d'index, qui pourrait ralentir progressivement une opération de copie en bloc à mesure que de plus en plus d'enregistrements sont ajoutés? (Peut-être quelque chose à voir avec la journalisation, même si je m'attendrais à ce que les opérations en bloc ne soient pas enregistrées?)
S'il n'y a vraiment aucun autre moyen d'obtenir les performances à part de laisser tomber le PK / index en premier, quelles mesures puis-je prendre pour m'assurer que l'index ne disparaît pas complètement, c'est-à-dire si la connexion à la base de données est perdue dans au milieu du processus?