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 TABLE
s 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)
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:
DROP
une table temporaire à la fin d'une transaction, créez-la avec le CREATE TEMPORARY TABLE ... ON COMMIT DROP
syntaxe.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.)temp_buffers
option dans postgresql.conf
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.
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.