J'utilise une base de données pour représenter une liste de fichiers et certaines métadonnées associées à chacun d'entre eux. J'ai besoin de mettre à jour régulièrement cette liste de fichiers, en ajoutant seulement les nouveaux fichiers et en supprimant les fichiers qui n'existent plus (je ne dois pas toucher les lignes existantes dans le tableau car je perdrais les métadonnées associées).Insertion incrémentielle efficace dans postgresql
Mes requêtes actuelles ne prennent que quelques secondes lorsque j'ai environ 10000 fichiers, mais prennent une heure avec ma table actuelle de 150000 fichiers.
Après quelques recherches sur Internet, je suis le processus suivant:
- Peupler une table "NewFiles" avec les résultats de l'analyse
DELETE FROM files WHERE path NOT IN (SELECT path FROM newfiles);
INSERT INTO files (SELECT * FROM newfiles WHERE path NOT IN (SELECT path FROM files));
J'ai aussi des index:
CREATE INDEX "files_path" ON "files" ("path");
CREATE INDEX "files_path_like" ON "files" ("path" varchar_pattern_ops);
CREATE INDEX "files_path" ON "newfiles" ("path");
CREATE INDEX "files_path_like" ON "newfiles" ("path" varchar_pattern_ops);
(J'utilise principalement ces index pour la recherche dans la base de données; mon application a un moteur de recherche dans les fichiers.)
Chacune de ces deux requêtes prend plus d'une heure quand j'ai 150000 fichiers. Comment puis-je optimiser cela?
Merci.
Une option parfois viable consiste à ajouter de nouvelles partitions: créer une nouvelle table qui 'INHERITS' une table parente, ajouter une contrainte appropriée, la peupler, créer des index sur elle. Cela ne fonctionne que lorsque vos nouvelles données peuvent être clairement partitionnées sur une seule contrainte. –
Cela ressemble plus à un problème d'ES de mémoire ou de disque. 150K lignes n'est pas un montant énorme - peut-être vous avez juste besoin d'allouer plus de mémoire à postgres? Même alors, quelle est la taille de la table. Il ne devrait pas prendre une heure pour lire toutes ces données à partir du disque. – AngerClown