Requête PostgreSQL très lente

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requête PostgreSQL très lente

Re: Requête PostgreSQL très lente

par pragmafabrik » 04 mars 2015, 12:04

Bonjour, le problème n'est pas trivial car, si j'ai bien compris, il s'agit de retourner une liste d'identifiants qui ne sont pas forcément présents dans la table temp et le cas échéant, n'ont pas d'enregistrements avec une date au cours de la semaine passée.

Pour éviter de faire une requête par identifiant (long) il faut faire une requête pour tous les identifiants qu'on veut vérifier, donc déjà les matérialiser en SQL. Ensuite, il faut vérifier qu'il n'existe pas d'id correspondant dans la table temp aux conditions voulues:

Code : Tout sélectionner

with mail_id as (select unnest(array[$tableau_id]) as id) select id from mail_id where not exists (select true from temp where temp.campaign_id = $campaign_id and mail_id.id = temp.id and date_s < now() - '1 week'::interval)
Et cela se passera beaucoup mieux avec un index sur (campaign_id, id).

Amicalement,
Grégoire

Re: Requête PostgreSQL très lente

par tof73 » 18 févr. 2015, 16:10

cela me paraitrait une bonne idée de, au moins, mettre un index sur campaign.

Requête PostgreSQL très lente

par adelinesc2 » 18 févr. 2015, 11:52

Bonjour à tous,

J'ai une table sous PostgreSQL : temp avec 4 colonnes (id int, campaign character varying, sender character varying, date_s date) de près de 9 millions lignes. Et c'est une table sans index.

Le souci intervient à chaque fois que j'essaie d'exécuter cette requête :

SELECT COUNT(*) FROM temp WHERE id = $idmail and campaign = '$variable_campaign' AND date > '$date_c' " dans une boucle de 100K

Je n'ai toujours pas obtenu de réponses (depuis 20/30 minutes). (Comme j'ai mis un set_time_limit illimité en PHP sinon j'aurai obtenu 500 error en 5 minutes)

En fait le but de toutes ces requêtes c'est de récupérer une liste de mails auxquels la campagne n'a pas été envoyé cette semaine.

Avez-vous des pistes svp, je me retrouve un peu bloquée.

J'avais aussi en tête si jamais je ne pourrai pas exécuter des requêtes sur une table de 9M de faire une sorte de système de fichiers temporaires mais je trouvais plus propre de le faire avec une base de données...

Merci pour vos réponses !