Diviser et vaincre, et procéder par élimination. Tout d'abord, ajoutez une LIMITE à votre requête de sorte que cela prend 10 minutes au lieu de 17 heures, ce qui rendra beaucoup plus facile d'essayer différentes choses.
Les processus s'exécutent-ils sur des machines différentes? Si tel est le cas, mesurez l'utilisation de la bande passante réseau pour vous assurer qu'il ne s'agit pas d'un goulot d'étranglement. Transférer un gros fichier, assurez-vous que la bande passante est vraiment là.
Les processus s'exécutent-ils sur la même machine? Peut-être que l'un affame l'autre pour IO. La source et la destination sont-elles le même disque dur? Différents disques durs? SSD? Vous devez expliquer ...
Examinez l'utilisation des E/S et du processeur des deux processus. Est-ce que l'on traite un maximum d'un cpu?
Est-ce qu'un processus max sur un des disques? Vérifiez iowait, iops, bande passante d'E/S, etc.
Combien de colonnes? Deux INT, 500 FLOAT, ou un énorme BLOB avec un PDF de 12 mégaoctets dans chaque rangée? Les performances peuvent varier entre ces cas ...
Maintenant, je suppose que le problème est du côté POSTGRES.
Créer une table factice, identique à votre table cible, qui a:
- mêmes colonnes exactes (CREATE factice TABLE comme la table)
- Aucun index, Pas de contraintes (je pense qu'il est la valeur par défaut, vérifiez la table créée)
- AVANT d'INSÉRER le déclencheur qui renvoie NULL et dépose la ligne.
Les lignes seront traitées, mais pas insérées.
Est-ce rapide maintenant? OK, donc le problème était l'insertion.
Répétez cette opération, mais cette fois en utilisant une table UNLOGGED (ou une TABLE TEMPORAIRE). Ceux-ci n'ont aucune résistance aux crashs car ils n'utilisent pas le journal, mais pour importer des données, c'est OK ... s'il se bloque pendant l'insertion, vous l'effacerez et le redémarrerez quand même.
Toujours Pas d'index, pas de contrainte. Est-ce rapide?
Si lent => E/S, problème de bande passante d'écriture, peut-être causé par autre chose touchant les disques Si rapide => IO est OK, problème non encore trouvé! Avec la table chargée de données, ajoutez les index et les contraintes un par un, vérifiez si vous avez, par exemple, un CHECK qui utilise une fonction SQL lente, ou un FK dans une table qui n'a pas d'index, ce type de des trucs. Vérifiez simplement combien de temps il faut pour créer la contrainte.
Remarque: pour une importation comme celle-ci, vous devez normalement ajouter des indices et des contraintes après l'importation. Mon intuition est que PG est en train de checkpointing comme un fou en raison du grand volume de données, en raison de réglages de point de contrôle trop bas dans la config. Ou une question comme celle-là, probablement des E/S aléatoires liées. Vous mettez le WAL sur un SSD rapide, non?
Merci @AlainD J'ai déjà vérifié tous ces points sauf le dernier. J'ai mis la mémoire à 6 Go, et pendant que le processus est en cours d'exécution pentaho ne prend jamais ce 6 Go. Query est un select simple *, prend un moment, mais je pense que ce n'est pas le goulot d'étranglement. Commitsize est défini sur 100.000 lignes. J'ai testé 10.000, 50.000 et 100.000 et même 500.000 et une meilleure performance est de 100.000. Le dernier point peut-il être la clé ?? – Maik
Vous êtes sûr d'avoir piraté le spoon.bat (spoon.sh) pour augmenter la taille de la mémoire JVM? Vous avez également – AlainD
oui. J'ai vu que spoon.sh a été modifié, et pour m'assurer que j'ajoute même une variable d'environnement avec le nom de la variable de mémoire dans spoon.sh réglé à 6GB. – Maik