2010-11-30 7 views
5

Beim Durchsuchen von stackoverflow fand ich eine große Anzahl von Antworten, die die Verwendung von Cursorn bei der Datenbankprogrammierung verurteilten. Allerdings verstehe ich nicht wirklich, was die Alternative ist.Was ist die Alternative zu Cursorn, um große Datenmengen aus einer Datenbank abzurufen?

Ich erstelle ein Programm, das eine große Anzahl von Zeilen (Hunderttausende) aus der Datenbank liest und aus Leistungsgründen im Speicher hält. Ich kann nicht wirklich eine SELECT * FROM-Tabelle ausführen und alle Ergebnisse auf einmal verarbeiten, oder?

Der beste Weg, den ich gefunden habe, ist Cursor zu verwenden und die Zeilen in Inkrementen, zum Beispiel 10 auf einmal abrufen.

Konnte jemand mich erleuchten? Ich benutze PostgreSQL 9 unter Linux.

Dank

Antwort

1

A CURSOR ist die beste Option, wenn Sie mit großen Datenmengen umgehen müssen. Sie können auch die Methode LIMIT .. OFFSET .. verwenden, die je nach Datenmenge jedoch langsamer und langsamer wird. PostgreSQL hat keine Probleme mit Cursorn, verwenden Sie diese, wenn Sie große Datenmengen verarbeiten.

SQL Server hat/hatte Probleme mit Cursoren, MySQL kann nicht mit Cursoren außerhalb gespeicherter Funktionen umgehen, das könnte der Grund dafür sein, dass einige dba's Cursor nicht mögen.

1

Sie können gerade die for-Schleife Datensatz verwenden:

do 
$$ 
declare r record; 

begin 

    for r in select product_id, name from products loop 
     raise notice '% %', r.product_id, r.jname; 
    end loop; 

end$$ 
1

Ich nehme an, dass der beste Weg, COPY zu verwenden ist erforderlich Datenanwendung direkt an Ihren Kunden zu erhalten.

Ich hatte auch kein Problem bei der Verwendung von Cursorn. Soweit ich verstehe, Cursor hält eine Momentaufnahme der Daten für Sie, und formal (und COPY) ist die einzige richtige Möglichkeit, die Ergebnisse durchblättern, da sonst bei der Verwendung LIMIT..OFFSET zu den Inkonsistenzen führen kann, wie der Offset geändert wird die neu eingefügten Datensätze.

0

Es sollte selten sein, einen Cursor zu benötigen. Wenn sich Ihre Logik ändert, wenn die vorherige Zeile aktualisiert wird, benötigen Sie möglicherweise einen Cursor.

Müssen Sie wirklich einen Cursor für Ihr Problem öffnen? Kannst du die Einzelheiten angeben, was du zu tun versuchst? Große Datenmengen sind ein guter Grund, Cursor zu vermeiden, kein Grund, sie zu verwenden.

Sie sollten versuchen, Set-basierte Verarbeitung zu tun. Nur regelmäßige Updates für die Tabellen, mit Joins und wo Filter.

Kann ein einfaches Update Ihre Cursorschleife ersetzen?

+0

Ich möchte die Daten nicht aktualisieren. Ich möchte sie aus Performancegründen in Datenstrukturen speichern. Also möchte ich sie in großen Mengen von der Datenbank in einen Prozess übertragen. Gibt es eine Cursor-Alternative dazu? –

0

Wenn Sie nur Daten herunterladen, warum nicht verwenden wählen? Sie sparen keinen Speicher, indem Sie 10 Zeilen gleichzeitig ziehen, weil Sie sie sowieso im Speicher zwischenspeichern.

Fehle ich etwas?

Verwandte Themen