Je travaille actuellement avec une base de données PostgreSQL dérivée de wikipedia-dump plus grande; il contient environ 40 Go de données. La base de données fonctionne sur un serveur HP Proliant ML370 G5 avec Suse Linux Enterprise Server 10; Je l'interroge depuis mon ordinateur portable sur un réseau privé géré par un simple routeur D-Link. J'ai assigné des adresses IP statiques DHCP (privées) à l'ordinateur portable et au serveur.Optimisation de requêtes PosgreSQL et le processus Postmaster '
Quoi qu'il en soit, à partir de mon ordinateur portable, en utilisant pgAdmin III, j'envoie quelques commandes SQL/requêtes; certains d'entre eux sont CREATE INDEX, DROP INDEX, SUPPRIMER, SELECT, etc. Parfois, j'envoie une commande (comme CREATE INDEX), elle retourne, me disant que la requête a été exécutée parfaitement, etc. Cependant, le processus postmaster assigné à un tel La commande semble rester sur le serveur. Maintenant, cela ne me dérange pas vraiment, car je me dis que PostgreSQL maintient un pool de postmasters prêts à traiter les requêtes. Pourtant, si ce processus mange 6 Go de mémoire vive de 9,4 Go, je m'inquiète (et il le fait pour le moment). Maintenant, c'est peut-être un cache de données qui est conservé dans la mémoire [partagée] au cas où une autre requête aurait besoin d'utiliser ces mêmes données, mais je ne sais pas.
Une autre chose me dérange.
J'ai 2 tables. L'un est le tableau page; J'ai un index sur sa colonne page_id. L'autre est le pagelinks tables qui a la colonne de pl_from que les références soit rien ou une variable dans la page.page_id colonne; Contrairement à la colonne page_id, la pl_from n'a pas encore d'index. Pour vous donner une idée de l'échelle des tables et la nécessité pour moi de trouver une solution viable, page table a 13,4 millions de lignes (après avoir supprimé ceux dont je n'ai pas besoin) tandis que la table pagelinks a 293 millions.
J'ai besoin d'exécuter la commande suivante pour nettoyer les pagelinks tableau de certaines de ses lignes inutiles:
DELETE FROM pagelinks USING page WHERE pl_from NOT IN (page_id);
Donc, fondamentalement, je veux débarrasser les pagelinks table de tous les liens provenant d'un page non dans la table page. Même après avoir désactivé les boucles imbriquées et/ou des analyses séquentielles, l'optimiseur de requêtes me donne toujours la « solution » suivante:
Nested Loop (cost=494640.60..112115531252189.59 rows=3953377028232000 width=6)
Join Filter: ("outer".pl_from <> "inner".page_id)"
-> Seq Scan on pagelinks (cost=0.00..5889791.00 rows=293392800 width=17)
-> Materialize (cost=494640.60..708341.51 rows=13474691 width=11)
-> Seq Scan on page (cost=0.00..402211.91 rows=13474691 width=11)
Il semble que cette tâche prendrait plus de semaines pour compléter; évidemment, c'est inacceptable. Il me semble que je préfère utiliser l'index page_id pour faire son truc ... mais c'est un optimiseur têtu et je me trompe peut-être.
Une idée?
En fait, c'est ce que je suis en train d'essayer car cela me semble être mon meilleur coup. Je posterai les résultats si cela fonctionne. THX! –