2015-09-03 17 views
6

Ho eseguito alcuni test di carico di AWS Redshift per una nuova applicazione e ho notato che ha un limite di colonna di 1600 per tabella. Peggio ancora, le query rallentano all'aumentare del numero di colonne in una tabella.Limite colonna AWS Redshift?

Ciò che non ha senso qui è che Redshift dovrebbe essere un database di archivio di colonne e non dovrebbe in teoria essere un hit di I/O da colonne che non sono selezionate in una particolare clausola where.

In particolare, quando TableName è 1600 colonne, ho trovato che la query sottostante è sostanzialmente più lenta di se TableName fosse, ad esempio, 1000 colonne e lo stesso numero di righe. Man mano che il numero di colonne diminuisce, le prestazioni migliorano.

SELECT COUNT(1) FROM TableName 
WHERE ColumnName LIKE '%foo%' 

I miei tre domande sono:

  1. Qual è il problema? Perché Redshift ha questa limitazione se afferma di essere un negozio di colonne?
  2. Qualche suggerimento per aggirare questa limitazione? Le unioni di più tabelle più piccole sembrano eventualmente approssimare le prestazioni di una singola tabella. Non ho provato a ruotare i dati.
  3. Qualcuno ha un suggerimento per una veloce, in tempo reale prestazioni, database di archivio di colonne scalabile orizzontalmente che non ha le limitazioni di cui sopra? Tutto quello che stiamo facendo è contare le query con semplici restrizioni dove circa 10M (righe) x 2500 (colonne) dati.
+1

Se sono necessarie più di 1600 colonne, è molto probabile che i dati siano scarsamente strutturati. Dovresti cercare le opportunità per normalizzare i tuoi dati * (come dici tu, in più tabelle) *. La limitazione del numero di colonne è semplicemente un fattore del motore di ottimizzazione e il numero di riferimenti memorizzati, probabilmente un retaggio della versione di PostGreSQL da cui proviene. Il limite di colonna e se è colonnare sono completamente indipendenti. Per quanto riguarda il calo delle prestazioni, non l'ho mai visto prima. La tua domanda è esattamente come sopra? – MatBailie

+1

Oh, e se hai a che fare solo con 10M x 2,5k, non dovresti aver bisogno di RedShift. Userei PostGreSQL per qualcosa di così piccolo. Sto usando RedShift per trilioni di righe distribuite di dozzine/centinaia di nodi. – MatBailie

+0

@MatBailie, le prestazioni devono essere sottocosto, motivo per cui abbiamo deciso di utilizzare Redshift. Sono abbastanza sicuro che uno dei principali vantaggi di un database di colonne è di poter estrarre qualsiasi colonna arbitraria senza un hit associato ad altre colonne. Puoi andare direttamente alle colonne di dati di cui hai bisogno, caricarle e il gioco è fatto. Sei completamente isolato dalle altre colonne. Infine, no, i miei dati sono ben strutturati. Ho letteralmente quel numero di attributi completamente indipendenti che mi piacerebbe interrogare. Pensa a un caso d'uso di segmentazione. Grazie. – mellocello

risposta

4

Non riesco a spiegare esattamente perché rallenta così tanto ma posso verificare che abbiamo sperimentato la stessa cosa.

Penso che parte del problema sia che Redshift memorizza almeno 1 MB per colonna per nodo. Avere un sacco di colonne crea un sacco di attività di ricerca del disco e sovraccarico I/O.

  • blocchi 1MB sono problematici perché la maggior parte che sarà spazio vuoto ma sarà comunque leggere del disco
  • Avendo un sacco di blocchi significa che i dati di colonna non verranno situato più vicino insieme così Redshift deve fare molto più lavoro per trovarli.

Inoltre, (mi è appena venuto in mente) sospetto che i controlli MVCC di Redshift aggiungano un sacco di spese generali. Cerca di ottenere una lettura coerente mentre la query è in esecuzione e presumibilmente richiede di prendere nota di tutti i blocchi per le tabelle nella query, anche i blocchi per le colonne che non vengono utilizzate. Why is an implicit table lock being released prior to end of transaction in RedShift?

FWIW, le nostre colonne erano praticamente tutti BOOLEAN e abbiamo avuto molto buoni risultati da loro (bit mascheramento) compattazione in INT/BIGINTs e l'accesso ai valori utilizzando le funzioni bit-saggio. Un tavolo di esempio è passato da 1400 cols (~ 200 GB) a ~ 60 cols (~ 25 GB) ei tempi di interrogazione sono migliorati di oltre 10 volte (da 30 a 40 fino a 1-2 secondi).

+0

Hmm. Quindi qualsiasi idea di cosa sarebbe meglio per il mio caso d'uso? Query con scalabilità orizzontale, ad alta disponibilità e conteggio dei secondi secondari con clausole where semplici contro un numero elevato di attributi (3k) e circa 10M righe? – mellocello

+0

Abbiamo valutato MemSQL durante il tentativo di risolvere questo problema.È _insanamente_ veloce ma solo sulla ** seconda ** esecuzione di una determinata query. La prima esecuzione è _molto lenta_ perché la compilano in profondità utilizzando GCC. Per noi, dato che le query sono molto ad-hoc, era meglio stare con Redshift e usare le funzioni bit-wise. Puoi anche provare Google BigQuery (ho sentito cose buone). –