Question

J'ai une application qui effectue des chargements groupés dans une grande table (100 millions de lignes).J'utilise Postgres COPY FROM fonctionnalité pour charger des données à partir d’un fichier plat.La table cible a une clé primaire de id.

Pour que l'insertion groupée fonctionne, j'ai créé les identifiants pour chaque ligne du fichier de chargement en utilisant :

 SELECT  nextval('apps_id_seq'::regclass)
 FROM    "apps"
 ORDER   BY "apps"."id" ASC
 LIMIT   1 

Malheureusement, je ne vois pas cette requête prendre plus de 150 secondes.Cela entraîne de nombreuses sauvegardes, car certains de ces fichiers contiennent des dizaines de milliers de lignes.

Pourtant, lorsque je l'exécute sur la ligne de commande, j'obtiens le retour en millièmes de milliseconde.Voici un explain analyze:

                                                            QUERY PLAN                                                                
------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.57..0.64 rows=1 width=4) (actual time=0.016..0.017 rows=1 loops=1)
   ->  Index Only Scan using apps_pkey on apps  (cost=0.57..15886651.40 rows=228128608 width=4) (actual time=0.015..0.015 rows=1 loops=1)
     Heap Fetches: 0
 Total runtime: 0.030 ms

Quelle pourrait être la cause du retard ?Le retard est signalé par le NewRelic service.

Était-ce utile?

La solution

J'ai étudié attentivement votre question, mais je n'arrive pas à comprendre la procédure que vous décrivez.(Vous pourriez travailler davantage sur la description.)

Pourquoi généreriez-vous des numéros de séquence à la main, alors que Postgres peut simplement les générer automatiquement ? Par documentation :

Si une liste de colonnes est spécifiée, COPY ne copiera que les données dans le fichier colonnes spécifiées vers ou à partir du fichier.S’il y a des colonnes dans le champ qui ne sont pas dans la liste des colonnes, COPY FROM insérera le fichier Valeurs par défaut de ces colonnes.

C'est moi qui souligne en gras.La valeur par défaut d'un serial La colonne est l'identifiant suivant de sa séquence.

Êtes-vous sûr de ne pas effectuer beaucoup de travail redondant et très coûteux ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top