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)
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
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
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