2013-04-09 4 views
1

A partir de ce document http://www.postgresql.org/docs/current/static/explicit-locking.htmlmode de verrouillage PostgreSQL

Je savais PostgreSQL propose différents modes de verrouillage pour contrôler l'accès simultané aux données dans les tableaux.

Mon problème est que j'ai beaucoup sessions pour accéder à mon DB, mais je suis confuse devrais-je fait 1 grande table avec 40 colonnes ou plusieurs tables de moins colonne (relation biunivoque).

  1. Parce que quand je sélectionne les données que je choisirai tout cela ---> il prend plus de temps quand je choisis de nombreuses tables à l'aide INNER JOIN, mais il faut moins de temps pour choisir entre 1 grande table. Donc, mon php répondra plus lentement si j'utilise plusieurs tables. Mais quand j'utilise juste une table pendant que plusieurs sessions mettent à jour mes données dans la table, j'ai peur des deadlocks ou du retard car les commandes UPDATE, DELETE et INSERT acquièrent le mode de verrouillage ROW EXCLUSIVE sur la table cible. En général, ce mode de verrouillage sera acquis par toute commande qui modifie les données d'une table.

Quelqu'un pourrait-il suggérer quelle est la meilleure approche à adopter? Une grande table ou plusieurs tables?

+1

Votre question pour une grande table ou de nombreuses tables est impossible de répondre sans savoir ce que vous y stockez. Le conseil standard est de normaliser votre schéma http://www.bkent.net/Doc/simple5.htm – Eelke

+0

J'ai stocké des informations sur le périphérique par exemple ID, nom, IP publique, IP privé, passerelle, masque, port externe, port interne, etc .. Je suis confus dois-je fait dans une grande table avec plusieurs colonnes ou le diviser en plusieurs tables, pour exp: dev_info, dev_ip, dev_port – user430926

+0

pour résoudre votre « requête lente », s'il vous plaît lire http: // wiki. postgresql.org/wiki/SlowQueryQuestions et mettez à jour votre question en conséquence. –

Répondre

6

Il est vrai que INSERT, UPDATE ou DELETE doit acquérir le verrou ROW EXCLUSIVE sur la table à mettre à jour.

Cependant, ce verrou n'empêche pas SELECT de travailler normalement. SELECT ne nécessite que le verrouillage ACCESS SHARE. Ce verrou est compatible avec ROW EXCLUSIVE - en d'autres termes, vous pouvez parfaitement exécuter SELECT tandis que d'autres données sont mises à jour par INSERT, UPDATE ou DELETE, tant que vous n'acquérez aucun verrou explicite. En d'autres termes, vous ne devriez jamais voir d'interblocages en utilisant la seconde approche (n'utilisez pas SELECT FOR UPDATE et tout ira bien).

Lire la suite dans PostgreSQL documentation.

+0

Que se passe-t-il si la première approche UPDATE une colonne, seconde approche aussi UPDATE autre colonne B, attendra-t-elle jusqu'à ce que la première transaction UPDATE se termine et puis UPDATE le second ou sera-t-il un conflit? – user430926

+2

Vous devriez lire [plus sur MVCC] (http://www.postgresql.org/docs/current/static/transaction-iso.html#XACT-READ-COMMITTED). TLDR: deuxième UPDATE * peut * attendre le premier si exactement la même ligne a été mise à jour. Dans ce cas, la normalisation devrait aider. – mvp

+0

Donc, le verrou EXCLUSIF ROW sur la table à mettre à jour, mais seulement verrouiller la ligne que je vais mettre à jour à droite? Pas toute la table? 1ère MISE À JOUR: UPDATE mytable SET ... WHERE clé = 1; – user430926

Questions connexes