2009-04-02 6 views
21

J'ai un utilitaire dans mon application où j'ai besoin d'effectuer une charge en vrac de INSERT, UPDATE & opérations DELETE. J'essaye de créer une transaction autour de ceci de telle sorte qu'une fois que ce système est invoqué et que les données lui soient fournies, il est garanti qu'il est tout ou pas ajouté à la base de données.Taille de transaction maximale dans PostgreSQL

Le problème, c'est ce que sont les conditions aux limites ici? Combien d'INSERT, UPDATE & DELETE puis-je avoir dans une transaction? La taille de la transaction est-elle configurable?

Toute aide serait appréciée.

-Merci

Répondre

18

Je ne pense pas qu'il y ait un montant maximum de travail qui peut être effectué dans une transaction. Les données continuent d'être ajoutées aux fichiers de la table, et éventuellement la transaction est validée ou annulée: AIUI ce résultat est stocké dans pg_clog; s'il revient en arrière, l'espace sera finalement récupéré par le vide. Ce n'est donc pas comme si la transaction en cours était conservée en mémoire et vidée au moment de la validation, par exemple.

+14

Ceci n'est que partiellement correct. À l'intérieur de chaque transaction se trouve un compteur de commandes qui traite de la visibilité à l'intérieur de la transaction. C'est un nombre de 32 bits qui finira par déborder si vous avez une très grosse transaction (des milliards de commandes). VACUUM, pg_clog etc ne traite que du nombre total de transactions dans le système, pas de ce qui se passe dans l'un d'entre eux. –

+0

@MagnusHagander Ce nombre de 32 bits est-il toujours vrai? Ce numéro a-t-il été mis à jour en 64 bits? – Kuberchaun

+0

Oui, le compteur de commande interne est toujours 32 bits. –

16

Pour un projet sur lequel je travaille, j'effectue 20 millions d'INSERT. J'ai essayé avec une grosse transaction et avec une transaction pour chaque million de INSERT et les performances semblent exactement les mêmes.

PostgreSQL 8.3

+1

Le système était-il local? Je pense que faire ceci sur un système où la latence est un facteur, la performance différerait. – user2677679

0

je crois que le montant maximum du travail est limitée par la taille de votre fichier journal. La base de données ne s'autorisera jamais à ne pas pouvoir revenir en arrière, donc si vous consommez tout votre espace de journal pendant la transaction, elle s'arrêtera jusqu'à ce que vous lui donniez plus d'espace ou de restauration. Ceci est généralement vrai pour toutes les bases de données.

Je recommanderais de regrouper vos mises à jour en morceaux gérables qui prennent plus de quelques minutes d'exécution, de cette façon vous savez s'il y a un problème plus tôt (par exemple, ce qui prend normalement 1 minute est toujours en cours après 10 minutes ... hmmm, est-ce que quelqu'un a laissé tomber un index?)

+8

Ce n'est pas le cas pour PostgreSQL. Nous pouvons recycler l'espace de journalisation lors d'une transaction en cours. Si vous effectuez une journalisation d'archives, vous aurez évidemment besoin d'espace dans l'emplacement d'archivage, mais pour le journal des transactions locales, ce n'est pas nécessaire. (vous aurez besoin de l'espace disque réel pour les données sur le disque, bien sûr). –

18

Une seule transaction peut exécuter environ deux milliards de commandes (2^31, moins IIRC un petit peu de frais généraux.) En fait, pensez-y, cela peut être 2^32 - le commandcounter est non signé je pense).

Chacune de ces commandes peut bien sûr modifier plusieurs lignes.

Questions connexes