2017-03-01 2 views
0

Wir haben eine Tabelle in einer Postgres DB, die unter anderem zwei Ganzzahlen auflistet, sagen i1, i2 und ein Doppel, sagen d.Alle Zeilen aus einer Postgres-Tabelle erhalten

Aus irgendeinem Grund benötigen wir alle Werte dieser Felder in allen Zeilen in dieser Tabelle. Außerdem müssen wir dies mit Java tun, frag mich nicht warum.

Ich versuche, den effizientesten Weg zu sehen, dies zu tun. Natürlich kann ich eine Java-Anweisung mit einer Abfrage

SELECT i1, i2, d FROM mytable; 

ausführen und dann über ResultSet iterieren. Ich bin besorgt, dass dies die DB belasten könnte.

Die Tabelle enthält wahrscheinlich mehrere Millionen Zeilen (definitiv weniger als 10m) und wir sind nur an diesen drei Feldern interessiert.

Wenn es ein einzelner Spalte Primärschlüssel ist, kann ich leicht einen Cursor Aufruf schreiben, wie so

SELECT i1, i2, d FROM mytable where primarykey > ?; 

Aber die Tabelle nicht einen einzigen Spalte Primärschlüssel.

Während i1 und i2 eindeutig sind, hat die Tabelle keinen Index, und da es sich nur um eine einmalige Aktivität handelt, ist es unwahrscheinlich, dass jemand im Team daran interessiert wäre, einen zu erstellen.

Ohne Index, ich vermute, die Auswahl aller Zeilen wird tatsächlich billiger als die Bestellung von i1 und i2 und dann Schreiben eines Cursors Anruf mit diesen.

Was ist die effizienteste und am wenigsten problematische Art, dies zu tun?

+0

Die select-Anweisung Sie zeigen haben die einzige Möglichkeit, das zu tun. Wahrscheinlich möchten Sie jedoch den Treiber so konfigurieren, dass die Ergebnisse mit einem Cursor abgerufen werden: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor –

+0

Sie können Daten durch Erstellen eines Indexes "vorbereiten" auf diese 3 Felder - auf diese Weise wird nur Index scannen, aber es macht nur Sinn, wenn Sie oft nur diese 3 Spalten scannen und zusätzliche Index ist erschwinglich –

+0

Hallo, es gibt keine einzelne Spalte Primärschlüssel und während i1 und i2 sind garantiert einzigartig, es gibt keinen Index. Der Beitrag wurde mit dieser Beschreibung aktualisiert. Tut mir leid, dass ich das vergessen habe, als ich die ursprüngliche Beschreibung geschrieben habe. – D159

Antwort

0

Führen Sie einfach die Auswahl aus, um alle Zeilen zu erhalten. Postgres kann damit absolut umgehen.

Lassen Sie keine order by aus, um die Verarbeitung weniger teuer zu machen.

Die einzige Sorge, die Sie haben sollten, ist der Speicherverbrauch des Treibers. Standardmäßig puffert der Postgres-Treiber alle Zeilen im Speicher, bevor er von einem executeQuery() Aufruf zurückkehrt.

Sie müssen wahrscheinlich den Treiber konfigurieren, um dies nicht zu tun. Dies wird in dem Fahrer Handbuch behandelt:

https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor

+0

Schnelle Folgefrage - funktioniert das mit PreparedStatement? d. h. begrenzt dies die Abrufgröße einer PreparedStatement Query? – D159

+0

@ D159 Es wird auch mit 'PreparedStatement' funktionieren (würde nicht viel Sinn machen, wenn es nicht so wäre) –

Verwandte Themen