Es gibt mehrere Möglichkeiten, über eine Ergebnismenge zu iterieren. Was ist der Kompromiss von jedem?cx_Oracle: Wie wiederhole ich eine Ergebnismenge?
Antwort
Die kanonische Methode besteht darin, den integrierten Cursor-Iterator zu verwenden.
curs.execute('select * from people')
for row in curs:
print row
können Sie fetchall()
verwenden, um alle Zeilen auf einmal zu bekommen.
for row in curs.fetchall():
print row
Es kann zweckmäßig sein, diese zu verwenden, um eine Python-Liste enthält die Werte zu schaffen zurückgegeben:
curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]
Dies kann für kleinere Ergebnismengen sinnvoll sein, kann aber schlechte Nebenwirkungen haben, wenn die Ergebnismenge ist groß.
Sie haben für das gesamte Ergebnis warten auf Ihre Client-Prozess zurückgegeben werden.
Sie können in Ihrem Client viel Speicher verbrauchen, um die aufgebaute Liste zu halten.
Es kann eine Weile dauern, bis Python die Liste erstellt und dekonstruiert, die Sie sowieso sofort verwerfen werden.
Wenn Sie wissen, eine einzelne Zeile, die in der Folge gibt es wieder richten Sie fetchone()
die einzige Reihe bekommen aufrufen können.
curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]
Schließlich kann man eine Schleife über die Ergebnismenge Abrufen einer Zeile zu einem Zeitpunkt. Im Allgemeinen hat dies keinen besonderen Vorteil gegenüber der Verwendung des Iterators.
row = curs.fetchone()
while row:
print row
row = curs.fetchone()
über die zweite Methode, was ist, wenn Sie einen SScursor verwenden? Wird es noch viel Gedächtnis auffressen? – Sylvain
Ich denke, SScursor ist für MySQL. Aber alles, was fetchall() hat, wird wahrscheinlich die gleiche Speicherbelegung haben, da es eine Liste aller zurückgegebenen Zeilen zurückgibt. –
dort ist auch die Art und Weise psyco-pg
scheint es zu tun ... Von dem, was ich sammeln, so scheint es, Wörterbuch artige Zeilen Proxies erstellen Schlüsselsuche in den Speicherblock von der Abfrage zurückgegeben abzubilden. In diesem Fall scheint es nützlich zu sein, die ganze Antwort zu holen und mit einer ähnlichen Proxy-Factory über die Zeilen zu arbeiten. Wenn man darüber nachdenkt, fühlt es sich eher wie Lua als Python an.
Auch sollte dies für alle PEP-249 DBAPI2.0 Schnittstellen anwendbar sein, nicht nur Oracle, oder meinst du nur schnellste mit Oracle?
Mein bevorzugter Weg ist der Cursor-Iterator, aber zuerst die Eigenschaft arrayize des Cursors.
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
In diesem Beispiel wird cx_Oracle Reihen von Oracle holt 256 Zeilen zu einer Zeit, die Anzahl der Netzwerk-Rundfahrten zu reduzieren, die durchgeführt werden müssen, um
In meinen Tests (in einer Datenbank, die durch LAN verbunden ist) schien dies tatsächlich identische (sogar langsamer, in ein paar Iterationen) Geschwindigkeit zu geben, verglichen mit dem wiederholten Ausführen von 'fetchone()'. Ich habe es mit ungefähr 12000 Einträgen gemacht ... Sehr merkwürdig! –
Der einzige Weg, den ich kenne, und ich bin in keiner Weise ein Oracle-Experte, dass dies der Fall ist, wenn Ihre Abfrage Zeichen große Objekt (CLOB) oder binary Large Object (BLOB) Typen zurückgibt. AFAI: Wenn Sie diese Objekte lesen, ist für jeden Datensatz ein weiterer Netzwerkrundlauf zum Datenbankserver erforderlich. Das bedeutet, dass Sie mit fetchmany tatsächlich das Schlimmste aus beiden Welten bekommen. – asmoore82
Für cx_Oracle, Verbindung zu einer 12c-Datenbank mit Standard-Spaltentypen (keine Clobs etc) Ich bekomme eine Beschleunigung, aber nur wenn ich Array-Größe * vor * die Abfrage ausführen. Genaue Zahlen werden offensichtlich massiv kontextabhängig sein, aber um eine Vorstellung von den Veränderungen der Größenordnung zu geben, ergibt meine Abfrage (die 5 Spalten zurückgibt) mit arraysize = 50 (Standard) 3,75us pro Zeile. Das Verringern von arrayize auf 1 ergibt 70us. Steigende Arraygröße auf 1000 ergibt 800ns – FredL
- 1. Wie wiederhole ich eine Liste?
- 2. Wie wiederhole ich eine einfangende Gruppe?
- 3. Wie wiederhole ich eine Funktion mit Javascript?
- 4. Wie kann ich eine MySQL-Ergebnismenge durchlaufen?
- 5. Wie wiederhole ich das Muster?
- 6. Wie wiederhole ich das Geschäftsjahr?
- 7. Wie durchläuft eine MySQL-Ergebnismenge
- 8. Wie installiere ich Cx_Oracle auf El Capitan
- 9. Wie wiederhole ich Sprite horizontal?
- 10. Wie wiederhole ich die Textur wie GL_REPEAT?
- 11. Wie wiederhole ich eine Ausnahme und behalte den Stack-Trace?
- 12. Wie wiederhole ich eine Bearbeitung für mehrere Zeilen in Vim?
- 13. Wie wiederhole ich eine Zeichenfolge 'x' in Livecode
- 14. Wie wiederhole ich eine Zeichenfolge 'x' mal gegeben 'y' Parameter
- 15. Wie wiederhole ich eine Anweisung N-mal (einfache Schleife)
- 16. Wie wiederhole ich eine Liste und lösche sie?
- 17. Wie wiederhole ich. Each Schleife eine Rekursion weniger
- 18. Wie wiederhole ich eine Zeichenfolge in C++ beliebig oft?
- 19. Wie wiederhole ich eine Stufe in Jenkins Workflow
- 20. Wie wiederhole ich eine Klasse meiner Kreation in Java?
- 21. Wie wiederhole ich Zeilenumbrüche in der Konsole?
- 22. MySQL Wie kann ich eine Ergebnismenge teilweise bestellen?
- 23. Wie transformiere ich eine flache Ergebnismenge mit Hibernate?
- 24. Wie erstelle ich eine übliche Rangfolge meiner Ergebnismenge in SQL?
- 25. Wie wiederhole ich Code von ähnlichen Aufgaben?
- 26. Wie wiederhole ich rdlc volle Seite
- 27. Wie wiederhole ich Fehler mit $ q.all
- 28. Wie wiederhole ich bestimmte Aktionen auf Vim?
- 29. Wie wiederhole ich Mocha Tests/Schleife
- 30. Wie wiederhole ich try-except Block
Es gibt Ausnahmen, aber die allgemeine Faustregel gilt: ist: Wenn es mehr als einen Weg gibt, es zu tun, liegt es wahrscheinlich daran, dass jeder Weg für verschiedene Situationen geeignet ist.Sonst gäbe es nur einen Weg. –