web-dev-qa-db-fra.com

Tables temporaires PostgreSQL

J'ai besoin d'effectuer une requête 2,5 millions de fois. Cette requête génère des lignes dont j'ai besoin pour AVG(column) puis utiliser ce AVG pour filtrer le tableau de toutes les valeurs inférieures à la moyenne. J'ai alors besoin de INSERT ces résultats filtrés dans une table.

La seule façon de faire une telle chose avec une efficacité raisonnable semble être de créer un TEMPORARY TABLE pour chaque thread python query-postmaster. J'espère juste que ces TEMPORARY TABLEs ne seront pas persistés sur le disque dur (du tout) et resteront en mémoire (RAM), à moins qu'ils ne manquent de mémoire de travail, bien sûr.

Je voudrais savoir si une TABLE TEMPORAIRE entraînera des écritures sur disque (ce qui interférerait avec les INSERTS, c.-à-d. Ralentir à l'ensemble du processus)

66
Nicholas Leonard

Veuillez noter que, dans Postgres, le comportement par défaut des tables temporaires est qu'elles ne sont pas automatiquement supprimées et que les données sont conservées lors de la validation. Voir ON COMMIT .

Les tables temporaires sont cependant supprimées à la fin d'une session de base de données :

Les tables temporaires sont automatiquement supprimées à la fin d'une session, ou éventuellement à la fin de la transaction en cours.

Vous devez tenir compte de plusieurs considérations:

  • Si vous voulez explicitement DROP une table temporaire à la fin d'une transaction, créez-la avec le CREATE TEMPORARY TABLE ... ON COMMIT DROP syntaxe.
  • En présence d'un regroupement de connexions , une session de base de données peut s'étendre sur plusieurs sessions client; pour éviter les conflits dans CREATE, vous devez supprimer vos tables temporaires - avant de renvoyer une connexion au pool (par exemple, en faisant tout à l'intérieur d'une transaction et en utilisant ON COMMIT DROP syntaxe de création), ou selon les besoins (en précédant tout CREATE TEMPORARY TABLE instruction avec un DROP TABLE IF EXISTS, ce qui a l'avantage de travailler également en dehors des transactions, par exemple si la connexion est utilisée en mode de validation automatique.)
  • Pendant que la table temporaire est en cours d'utilisation, quelle partie de celle-ci tiendra en mémoire avant de déborder sur le disque? Voir le temp_buffers option dans postgresql.conf
  • Autre chose dont je devrais m'inquiéter lorsque je travaille souvent avec des tables temporaires? Un aspirateur est recommandé après avoir déposé les tables temporaires DROPped, pour nettoyer les tuples morts du catalogue. Postgres passera automatiquement l'aspirateur toutes les 3 minutes environ lorsque vous utilisez les paramètres par défaut (auto_vacuum).

En outre, sans rapport avec votre question (mais peut-être liée à votre projet): gardez à l'esprit que, si vous devez exécuter des requêtes sur une table temporaire après vous l'avez remplie, alors c'est un bon idée de créer des indices appropriés et d'émettre un ANALYZE sur la table temporaire en question après vous avez fini de l'insérer. Par défaut, l'optimiseur basé sur les coûts suppose qu'une table temporaire nouvellement créée a environ 1 000 lignes, ce qui peut entraîner de mauvaises performances si la table temporaire contient réellement des millions de lignes.

102
vladr

Les tables temporaires n'offrent qu'une seule garantie - elles sont supprimées à la fin de la session. Pour une petite table, vous aurez probablement la plupart de vos données dans le magasin de sauvegarde. Pour une grande table, je garantis que les données seront vidées périodiquement sur le disque car le moteur de base de données a besoin de plus d'espace de travail pour d'autres demandes.

EDIT: Si vous avez absolument besoin de tables temporaires RAM uniquement, vous pouvez créer un espace table pour votre base de données sur un disque RAM (/ dev/shm fonctionne). Cela réduit la quantité de IO disque, mais sachez qu'il n'est actuellement pas possible de le faire sans une écriture de disque physique; le moteur de base de données videra la liste des tables en stockage stable lorsque vous créerez la table temporaire.

15
Adam Hawes