Stockage et interrogation de données roulantes dans PostgreSQL

12

J'ai une grande quantité de données de modèles météorologiques mises dans une base de données PostgreSQL. La machine possède 8 cœurs et 16 Go de RAM. J'utilise PostgreSQL 9.3 avec PostGIS 2.1. Chaque tableau aura une variété différente de données météorologiques (température, point de rosée, vent, etc.). Chaque table aura 6-7 colonnes: latitude, longitude, géométrie du point, élévation, date-heure pour laquelle le modèle est pertinent et 1-2 valeurs de données d'intérêt. Les données seront principalement interrogées pour une boîte englobante par le temps et l'élévation. Il y aura environ 145 757 360 lignes par table (les données plus anciennes que maintenant ne sont plus pertinentes seront supprimées). J'évalue approximativement la taille des tables à environ 10 Go chacune sans index. (C'est 52 octets de données plus 23 octets de surcharge par ligne). Les données seront régulièrement mises à jour / insérées à mesure que de nouvelles données de modèle seront disponibles. Remarque:

Je regarde donc ces deux plans:

  1. Il vous suffit d'indexer et de regrouper par (date / heure, élévation) avec un index supplémentaire pour la géométrie du point. Exécutez un travail cron régulier qui supprime les anciennes lignes, exécute le vide / analyse et re-cluster.
  2. Partitionner par datetime puis cluster et indexer par élévation par table avec un index sur la géométrie. Exécutez une tâche cron régulière pour ajouter de nouvelles tables à l'avenir et supprimer les anciennes tables.

Plus loin,

  • Donc, je sais que supprimer une table est beaucoup plus efficace et supprimer et passer l'aspirateur. Mais verrais-je une amélioration des performances autrement?
  • Les partitions sont-elles appropriées lorsque toutes les tables seront régulièrement mises à jour et sélectionnées jusqu'à ce qu'elles soient supprimées comme non pertinentes (la documentation indiquait que les partitions fonctionnaient mieux alors que seules quelques-unes seraient sélectionnées)?

Lors de la livraison des données, les sélections seront-elles plus rapides que l'index clusterisé? La réponse change-t-elle si plusieurs demandes sont faites en même temps?

Je vous remercie. J'espère avoir mis en place toutes les données nécessaires. Sinon, faites le moi savoir et je vais l'ajouter.

bshender
la source
1
Aïe, ces lignes étroites sont celles où les en-têtes de ligne de grande taille de PostgreSQL commencent à vraiment faire mal. Dommage qu'il n'y ait pas grand-chose à retirer; ce n'est pas comme nous pouvons perdre xminou xmax, etc. Il y a une caractéristique qui pourrait en faire 9.4 que vous excitera probablement, appelée index minmax, qui fera des choses comme cela beaucoup plus pratique.
Craig Ringer
1
Est la combinaison répétitive suivante: "latitude, longitude, géométrie du point, élévation". Si oui, sa normalisation dans une autre table peut économiser de l'espace.
AK
Seulement marginalement. Une géométrie PostGIS est un tableau binaire et non lisible par l'homme. Je pouvais dériver ces valeurs en sortie, mais je ne pouvais alors pas les regrouper. Je pourrais utiliser un GeoHash pour regrouper, mais ce n'est pas plus lisible que le lat lon ne le serait. Mais de toute façon, l'espace n'est pas le problème. Ils ont offert autant de terrabytes que je peux remplir. Le problème est que je ne peux pas interroger les terrabytes à grande vitesse. La base de données elle-même sera en grande partie non transactionnelle. Seuls deux scripts auront un accès en écriture. Tout le reste est strictement en lecture seule.
bshender
Craig: Ils semblent intrigants, j'ai hâte de les expérimenter lorsqu'ils sortiront. Avez-vous des réflexions sur ma configuration en 9.3?
bshender
1
Pourriez-vous fournir deux informations: 1) Qu'est-ce qui est le plus important pour vous, insérer la vitesse ou la vitesse de requête? 2) Quelles requêtes sont les plus courantes?
Thomas Kejser

Réponses:

1

Tout bien considéré, je choisirais l'option 2. Les dates seront également sélectionnées, mais je suppose que pour une requête donnée, une ou deux partitions de date seront impliquées. C'est dommage que vous ne puissiez pas vous regrouper sur la géolocalisation et partitionner à la date, ce qui serait idéal. L'élévation a tendance à être en corrélation avec la géolocalisation de toute façon, si les zones de délimitation sont suffisamment petites.

Compte tenu des choix disponibles, des opérations de nettoyage des données et d'éviter un vide quotidien sont une bonne chose à avoir.

La livraison de sélections peut être plus rapide avec l'option 1, bien que je pense que ce sera probablement un lavage. Avec l'option 1, les enregistrements avec la même date et la même altitude sont placés les uns à côté des autres dans un grand index groupé. Avec l'option 2, les enregistrements ayant la même date et la même altitude sont placés les uns à côté des autres dans de nombreux index cluster plus petits.

Carlos Bueno
la source