2016-07-26 15 views
0

Ich analysiere eine 50 GB (16M Zeilen, 15 Spalten) Tabelle mit PostgreSQL 9.4 nur ausgewählte Abfragen verwenden (keine Einfügung \ Updates). Mein Server hat 4 virtuelle Sockets und 16 GB RAM. Eine typische Abfrage ich verwende:Große Abfragezeit für Analysezwecke

select y,count(z) from table where x in (select * from verySmallTable) group by y; 

Das Ergebnis der Abfrage werden zu einem Python-Skript füttern.

Ich habe versucht, verschiedene Indizes zu erstellen, aber noch kann jede Abfrage 15 Minuten dauern. Darüber hinaus ist die Optimierung der Datenbank zeitaufwendig.

Auf der anderen Seite verwende ich Tableau (mit Datenextrakt), um ähnliche Informationen abzurufen und ein Ergebnis in weniger als einer Minute zu erhalten. Daraus schließe ich, dass solche Analyseabfragen mit der richtigen Struktur (automatisch erstellt) sehr schnell ausgeführt werden können.

Ich bin auf der Suche nach einer Möglichkeit, die Abfrage Laufzeit zu reduzieren, mit PostgreSQL (ich habe auch Oracle-Lizenz), oder eine andere Open-Source-DB oder sogar eine lokale Lösung in Python, die ich die Daten laden kann in, ohne die Struktur für jede Abfrage optimieren zu müssen.

+1

Sie laden 50 GB in Tableau und erzielen eine bessere Leistung als in Postgres? –

+0

Bitte lesen Sie http://stackoverflow.com/tags/postgresql-performance/info, bearbeiten Sie dann Ihre Frage und fügen Sie die fehlenden Informationen hinzu. –

+0

@a_horse_with_no_name, danke ich habe die Informationen hinzugefügt. Gordon Linoff, ja, ein einfaches "select (distinct (userName)) aus der Tabelle" zum Beispiel verwende ich keinen Index für diese Spalte - das ist ein Teil des Problems, wie ich erklärte, ich bin nicht unbedingt auf der Suche nach zu bleiben mit PostgreSQL ist es nur eine einzige Tabelle. –

Antwort

1

Lassen Sie mich nehme an, dies ist Ihre Abfrage:

select t.y, count(t.z) 
from table t 
where t.x in (select vst.x from verySmallTable vst) 
group by t.y; 

Und dass der x Wert in dem kleinen Tisch einzigartig sind. Ich würde vorschlagen, die Abfrage wie das Schreiben:

select t.y, count(t.z) 
from verySmallTable vst join 
    table t 
    on t.x = vst.x 
group by t.y; 

Dazu wollen Sie einen Index für table(x, y, z) - mit den Spalten in dieser Reihenfolge.

+0

Ein FK in 'verySmallTable', der auf' table' zeigt, würde auch nicht schaden. –

+0

@ TulainsCórdova. . . Eigentlich könnte es den Optimierer verwirren. Sie möchten wirklich einen vollständigen Tabellenscan für die gesamte Tabelle durchführen und dann in der großen Tabelle nachschlagen. –

+0

Was ich versuchte zu erklären, ist, dass ich Varianten der Abfrage verwende, zum Beispiel auf verschiedenen Feldern. Dazu muss ich manuell eine große Anzahl von Indizes erstellen. Ich versuche nicht, diese spezielle Abfrage zu optimieren, ich suche nach einer Lösung, die das für mich tun wird (die gleiche Art, wie Tableau das für mich tut). –