Vous n'êtes pas identifié(e).
Bonjour,
Est il possible de limiter le nombre d'enregistrements que pourrait contenir une table? (sinon limiter la taille?)
Et si oui, écraser les plus anciens enregistrements lors de l'ajout d'un nouvel enregistrement ? (genre de buffer tournant)
Merci à vous!
Hors ligne
Pas directement. Mais tu dois pouvoir y arriver en ajoutant un trigger qui te gèrera ce comportement.
Guillaume.
Hors ligne
Mais attention à un trigger qui ferait des count(*) ... il risque de fortement ralentir l'appli, puisque full scan de la table à tous les coups.
En fait le problème, c'est qu'une table n'a pas 'un nombre d'enregistrements', puisque chaque session peut en voir un nombre différent, étant chacune à un niveau de transaction différent.
Ou alors, si ca n'est pas gênant, on peut faire une sérialisation des accès sur cette table, avec un compteur sur une autre table. Mais ça risque d'entraîner de forts problèmes de contention sur l'appli qui serait derrière. Donc difficile de répondre avant d'en savoir plus.
A quoi va servir la table ?
Marc.
Hors ligne
la table logge des évènements, et devrait contenir au maximum 2000 enregistrements. Pour le moment j'ai fait un trigger, qui a partir de 2000 enregistrements, supprime le plus vieux et ajoute le nouveau.
Je ne constate pas encore de gros ralentissement, mais j'imagine le jour ou on demande d'avoir la possibilité d'avoir 100000 enregistrements, là je pense qu'il y aura problème.
Hors ligne
À priori, ça n'a pas besoin d'être très précis, donc la solution par trigger devrait fonctionner.
Cela étant, je ne vois pas l'intérêt de bloquer à 2000 (ou à tout autre nombre). Quel est le but ? gagner en espace disque ? en performance ?
Guillaume.
Hors ligne
pas du tout, c'est une limite que nous nous sommes imposée délibérément
en tout cas merci pour vos réponses!
Hors ligne
Si le but c'est juste d'éviter que la table ne grossisse trop, il vaut mieux faire un delete à intervalle régulier que de pénaliser les insertions 'normales' dans la table.
Dernière modification par Marc Cousin (04/06/2009 18:47:23)
Marc.
Hors ligne
Oui mais on ne veut perdre aucune information si aucun insert n'arrive. On souhaite avoir le meme principe qu'un buffer tournant...
Hors ligne
Bien sûr. On peut donc imaginer avoir une requête qui se lance par exemple une fois par minute et qui supprime tous les enregistrements sauf les 2000 derniers.
Le seul défaut que je vois à cette solution, c'est si on a une volumétrie très élevée sur une période très courte, le buffer grossira anormalement, mais de façon très temporaire. L'avantage étant vraiment avec cette méthode que les insertions seront bien plus performantes que de lancer un trigger lourd à chaque fois.
Marc.
Hors ligne
on peut régler des requêtes périodiques?
Hors ligne
Oui, avec cron sous Unix ou les tâches planifiées sous Windows.
Guillaume.
Hors ligne
Hm, je suis sous un Windows XP Embedded et ce module n'a pas été implémenté...
Il n'y a pas de fonction interne a PostGreSQL capable de faire çà d'une façon ou d'une autre, sans passer par une configuration Windows?
Hors ligne
Il n'y a pas de fonction interne a PostGreSQL capable de faire çà d'une façon ou d'une autre, sans passer par une configuration Windows?
Non.
Guillaume.
Hors ligne
oki oki! bon bah on va rester sur le bon gros trigger alors ;-)
Merci encore gleu!
Hors ligne