Utiliser PG 9.1 sur Ubuntu 12.04.
Il nous faut actuellement jusqu'à 24 heures pour exécuter un grand nombre d'instructions UPDATE sur une base de données, qui se présente sous la forme:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
(Nous ne faisons que remplacer des champs d'objets identifiés par un ID.) Les valeurs proviennent d'une source de données externe (pas déjà dans le DB dans une table).
Les tables ont des poignées d'indices chacune et aucune contrainte de clé étrangère. Aucun engagement n'est fait jusqu'à la fin.
Il faut 2h pour importer une partie pg_dump
de la base de données. Cela semble être une base de référence que nous devrions raisonnablement cibler.
Mis à part la production d'un programme personnalisé qui reconstruit en quelque sorte un ensemble de données que PostgreSQL peut réimporter, pouvons-nous faire quelque chose pour rapprocher les performances UPDATE en bloc de celles de l'importation? (C’est un domaine que nous pensons être bien géré par les arbres de fusion logarithmiques, mais nous nous demandons s’il est possible de faire quelque chose dans PostgreSQL.)
Quelques idées:
- abandonner tous les index non-ID et reconstruire ensuite?
- checkpoint_segments croissants, mais cela aide-t-il réellement à un débit soutenu à long terme?
- en utilisant les techniques mentionnées ici ? (Charger les nouvelles données sous forme de table, puis "fusionner" les anciennes données sans identifiant)
Fondamentalement, il y a beaucoup de choses à essayer et nous ne savons pas ce qui est le plus efficace ou si nous négligeons d'autres choses. Nous allons passer les prochains jours à expérimenter, mais nous pensions pouvoir le faire ici aussi.
J'ai une charge simultanée sur la table mais elle est en lecture seule.
explain analyze
l'utilisation d'un index pour la recherche?