Archiviazione e interrogazione dei dati a rotazione in PostgreSQL


12

Ho una grande quantità di dati del modello meteorologico inseriti in un database PostgreSQL. La macchina ha 8 core e 16 GB di RAM. Sto eseguendo PostgreSQL 9.3 con PostGIS 2.1. Ogni tabella avrà una diversa varietà di dati meteorologici (temperatura, punto di rugiada, vento, ecc.). Ogni tabella avrà 6-7 colonne: latitudine, longitudine, geometria del punto, elevazione, data-ora per cui il modello è rilevante e 1-2 valori di dati di interesse. I dati verranno interrogati principalmente per un rettangolo di selezione per tempo ed elevazione. Ci saranno circa 145.757.360 righe per tabella (i dati più vecchi di adesso non più rilevanti verranno eliminati). Stimo approssimativamente la dimensione dei tavoli in circa 10 GB ciascuno senza indici. (Sono 52 byte di dati più 23 byte di overhead per riga). I dati verranno periodicamente aggiornati / inseriti non appena saranno disponibili i dati del nuovo modello. Nota:

Quindi sto guardando questi due piani:

  1. Basta indicizzare e raggruppare per (datetime, elevazione) con un indice aggiuntivo per la geometria del punto. Esegui un normale processo cron che elimina le vecchie righe, esegue il vuoto / analisi e ri-cluster.
  2. Partizione per datetime e quindi cluster e indice per elevazione per tabella con un indice sulla geometria. Esegui un normale processo cron per aggiungere nuove tabelle andando avanti e rilasciando vecchie tabelle.

Ulteriore,

  • Quindi, so che far cadere un tavolo è molto più efficiente e cancellare e passare l'aspirapolvere. Ma vedrei un aumento delle prestazioni altrimenti?
  • Le partizioni sono appropriate quando tutte le tabelle saranno uniformemente aggiornate e selezionate fino a quando non vengono eliminate come irrilevanti (la documentazione indicava che le partizioni funzionavano meglio quando solo alcune di esse sarebbero state selezionate)?

Durante la consegna dei dati, le selezioni saranno più veloci dell'indice cluster? La risposta cambia se vengono fatte più richieste contemporaneamente?

Grazie. Spero di mettere su tutti i dati necessari. Altrimenti fammi sapere e lo aggiungerò.


1
Inoltre, queste righe strette sono le intestazioni di grandi righe di PostgreSQL che iniziano a fare molto male. Peccato che non ci sia molto da rimuovere; non è che possiamo perdere xmino xmax, ecc. C'è una caratteristica che potrebbe trasformarla in 9.4 che probabilmente ti entusiasmerà, chiamata indici minmax, che renderà le cose come questa molto più convenienti.
Craig Ringer,

1
È la seguente combinazione ripetitiva: "latitudine, longitudine, geometria del punto, elevazione". Se sì, la normalizzazione in un'altra tabella può risparmiare un po 'di spazio.
AK,

Solo marginalmente. Una geometria PostGIS è un array binario e non leggibile dall'uomo. Potrei derivare quei valori in output, ma poi non riesco a raggrupparli. Potrei usare un GeoHash per raggruppare, ma questo non è più leggibile di quanto sarebbe il lat lon. Ma in entrambi i casi lo spazio non è il problema. Mi hanno offerto tutti i terrabyte che posso riempire. Il problema è che non riesco a interrogare terrabyte alla velocità. Il database stesso sarà in gran parte non transazionale. Solo due script avranno accesso in scrittura. Tutto il resto è di sola lettura.
bshender,

Craig: Sembrano intriganti, non vedo l'ora di sperimentare con loro quando usciranno. Qualche idea sulla mia configurazione in 9.3 però?
bshender,

1
Potresti fornire due informazioni per favore: 1) Qual è la cosa più importante per te, inserire la velocità o la velocità della query? 2) Quali sono le domande più comuni?
Thomas Kejser,

Risposte:


1

Tutto considerato, andrei con l'opzione 2. Le date saranno selezionate in modo uniforme su, ma ho intenzione di indovinare che per una determinata query saranno coinvolte solo una o due partizioni di data. È un peccato che non si possa raggruppare su geolocalizzazione e partizione alla data, il che sarebbe l'ideale. L'elevazione tende comunque a correlarsi con la geolocalizzazione, se i rettangoli sono sufficientemente piccoli.

Date le scelte disponibili, è meglio avere operazioni di dati più pulite ed evitare un vuoto giornaliero.

Consegnare selezioni può essere più veloce con l'opzione 1, anche se sospetto che probabilmente sarà un lavaggio. Con l'opzione 1, i record con la stessa data ed elevazione vengono collocati uno accanto all'altro in un grande indice cluster. Con l'opzione 2, i record con la stessa data e la stessa elevazione vengono collocati l'uno vicino all'altro in molti indici cluster più piccoli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.