2010-05-24 5 views
4

j'ai une requête de mise à jour simple (type de colonne foo est booléens (par défaut false)):Pourquoi la requête de mise à jour postgresql si lent parfois, même avec l'indice

update tablename set foo = true where id = 234; 

qui « id » est réglé sur (primaire) clé, et si je cours « expliquer l'analyse » je suis:

Index Cond: (id = 234) 
Total runtime: 0.358 ms 

mais encore, j'ai beaucoup de requêtes inexpliquées au journal lent (pgfouine), qui a pris plus de 200s (?!):

Times executed: 99, Av. duration (s): 70 

quelqu'un peut-il s'il vous plaît expliquer, quelle est la raison pour cela? (1,5 mio lignes dans la table, postgresql 8.4)

+0

Si 'id' est PK (donc il y a au plus une ligne mise à jour) cela devrait être pratiquement instantané. Soit vous avez un problème (analyse de vide de fonctionnement verbose) ou une autre requête verrouille toute la table ... Vous ne pouvez pas ideintify ces requêtes 200s dans votre journal postgresql? Avez-vous défini le paramètre "log_duration" dans votre configuration? – leonbloy

+0

oui, j'ai mis "log_min_duration_statement" à 1000, c'est pourquoi j'ai eu ces requêtes dans le fichier slowlog. identifié ces requêtes 200s à partir de ce fichier journal et ne sont que ces simples mises à jour. dans quel cas postgresql verrouiller toute la table, n'est-ce pas géré par le verrouillage de niveau de ligne? est-il possible d'identifier "qui" verrouille cela? Est-il possible que cette requête lente est la cause de la ligne nouvellement créée? juste deviner, je n'ai aucune autre idée – matija

+0

dans postgresql, les mises à jour ne verrouillent pas les lecteurs du tout, donc le verrouillage peut ne pas être le problème du tout. avez-vous réglé des paramètres comme shared_buffers? Est-ce que les requêtes qui s'exécutent de façon imprévisible se produisent lentement à des moments particuliers? se produisent-ils plusieurs ensemble ou juste un seul de temps en temps? – araqnid

Répondre

2

Ma première supposition serait que vous ayez une autre requête verrouillant toute la table ou les lignes qui sont mises à jour. Votre mise à jour simple est obligé d'attendre que cette autre opération soit terminée.

1

Vérifiez que vous n'avez aucun index ou contrainte sur la colonne mise à jour. Si tel est le cas, la base de données peut effectuer un recalcul d'index ou une évaluation de contrainte. Ces tâches supplémentaires ne sont pas incluses dans le résultat EXPLAIN ANALYZE.

Autre possibilité: lent à cause des opérations d'E/S. Cochez cette case thread about UPDATE performance in Postgres.

+1

Re: mises à jour lentes, cela peut également être utile: http://stackoverflow.com/questions/3361291/slow-simple-update-query-on-postgresql- base de données avec 3 millions de lignes # comment3495735_3361903 –

Questions connexes