2010-03-17 8 views
6

Ich habe eine große Tabelle (> 50 m Zeilen), die einige Daten mit einer ID und Zeitstempel hat:Beschleunigung PostgreSQL-Abfrage, wo Daten zwischen zwei Terminen sind

id, timestamp, data1, ..., dataN 

... mit einem mehrspaltigen Index auf (id, timestamp).

Ich brauche die Tabelle abzufragen alle Zeilen mit einer bestimmten ID zu wählen, in dem der Zeitstempel zwischen zwei Daten, die ich zur Zeit mit tue:

SELECT * FROM mytable WHERE id = x AND timestamp BETWEEN y AND z 

Das zur Zeit dauert mehr als 2 Minuten auf einem High-End Maschine (2x 3Ghz Dual-Core-Xeons mit HT, 16 GB RAM, 2x 1 TB Laufwerke in RAID 0) und ich würde es wirklich gerne beschleunigen.

Ich habe this tip gefunden, die die Verwendung eines räumlichen Index empfiehlt, aber das Beispiel gibt es für IP-Adressen. Allerdings ist die Geschwindigkeitssteigerung (436s bis 3s) beeindruckend.

Wie kann ich dies mit Zeitstempeln verwenden?

+0

* Definieren High-End-Maschine? Wirklich ... 50 Millionen Reihen sind heute nach heutigen Maßstäben ein großer Tisch. * Also, die Tabelle hat ID - wo ist der Zeitstempel? * Welche Indizes? Fehlender Index plus beschissene Hardware (High End + normale Discs) könnte zu diesen Ergebnissen führen. – TomTom

+0

Dual 3GHz Xeon Dual-Cores mit HT, 16GB RAM etc. Die Tabelle hat (ID, Timestamp, Daten) mit einem mehrspaltigen Index (ID, Timestamp). – Roger

+1

NICHT High End mit allen Mitteln .... vor allem, wie Sie nichts über die ..... Discs sagen, die der kritische Teil für jeden Datenbankserver sind. VIEL MEHR als die CPU oder der RAM. Was ist dein CD-Layout? – TomTom

Antwort

0

Sicherstellen, dass der Index TableID + TableTimestamp ist, und Sie tun eine Abfrage wie:

SELECT 
    .... 
    FROM YourTable 
    WHERE TableID=..YourID.. 
     AND TableTimestamp>=..startrange.. 
     AND TableTimestamp<=..endrange.. 

, wenn Sie Funktionen auf den Tisch des TableTimestamp gelten Spalte in der WHERE, werden Sie nicht in der Lage sein, vollständig um den Index zu verwenden .

Wenn Sie dies bereits tun, ist Ihre Hardware möglicherweise nicht für die Aufgabe geeignet.

, wenn Sie Version 8.2 verwenden oder später sollten Sie versuchen:

WHERE (TableID, TableTimestamp) >= (..YourID.., ..startrange..) 
    and (TableID, TableTimestamp) <= (..YourID.., ..endrange..) 
6

Dass Spitze nur geeignet ist, wenn Sie zwei Spalten A und B haben und Abfragen verwenden wie:

where 'a' between A and B 

Das ist nicht:

where A between 'a' and 'b' 

auf date(column) Mit Index statt column könnte es ein wenig beschleunigen.

+0

Der Tipp erwähnt, dass es für die Zeit geeignet ist, "schnelles Intervall (von Zeit oder IP-Adressen) Suche mit räumlichen Indizes"? Danke für den anderen Hinweis. – Roger

+0

Es ist für die Zeit geeignet. Aber es ist nur geeignet, wenn Ihre Tabelle Intervalle (d. H. Zwei Spalten) hat und Sie dort nach einem Wert suchen. Nicht, wenn Sie einzelne Spalten mit einem Intervall vergleichen. –

+0

Ahhh, ich verstehe. Entschuldigung, ich habe die Bewerbung missverstanden. – Roger

1

Konnten Sie EXPLAIN die Abfrage für uns? Dann wissen wir, wie die Datenbank Ihre Abfrage ausführt. Und was ist mit der Konfiguration? Was sind die Einstellungen für shared_buffers und work_mem? Und wann hast du (oder dein System) das letzte Vakuum analysiert und analysiert? Und zuletzt, welche OS und pgSQL-Version verwendest du?

Sie können wunderbare Indizes erstellen, aber ohne die richtigen Einstellungen kann die Datenbank sie nicht sehr effizient verwenden.

Verwandte Themen