Führen Sie eine vorbereitete Anweisung in sqlalchemy
Habe ich zu laufen 40K Anforderungen gegen einen username (Benutzername):
SELECT * from user WHERE login = :login
Ist es langsam, so dass ich dachte, ich würde nur verwenden Sie eine vorbereitete Anweisung.
Also ich weiß
e = sqlalchemy.create_engine(...)
c = e.connect()
c.execute("PREPARE userinfo(text) AS SELECT * from user WHERE login = $1")
r = c.execute("EXECUTE userinfo('bob')")
for x in r:
do_foo()
Aber ich habe einen:
InterfaceError: (InterfaceError) cursor already closed None None
Ich verstehe nicht, warum ich eine Ausnahme
- Für mich funktioniert. Welche version Sie verwenden, es war eine leichte Veränderung in cursor-handling vor 0.5 (r5236), das konnte haben das Problem behoben. Aber auch wenn es funktioniert, ich bezweifle stark mit der Analyse und Planung overhead ist groß genug, um es wirklich egal. Stapelverarbeitung Dinge zusammen, wie unten vorgeschlagen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, wie Sie Sie zu lösen, um den cursor verbundene Fehlermeldung erscheinen, aber ich glaube nicht, dass eine vorbereitete staement zu lösen, wird Ihre performance-Problem - so lange, wie Ihr mithilfe von SQL server 2005 oder höher, wird der Ausführungsplan für
SELECT * from user WHERE login = $login
wird schon wieder verwendet werden und es wird keinen performance-Gewinn von der vorbereiteten Anweisung. Ich weiß nicht, über MySql oder eine andere SQL-Datenbank-Server, aber ich vermute, auch Sie haben ähnliche Optimierungen für Ad-Hoc-Abfragen, die vorbereitete Anweisung überflüssig.Es klingt wie die Ursache der performance-hit ist mehr an der Tatsache, dass Sie machen von 40.000 round-trips zur Datenbank - Sie sollten versuchen, und schreiben Sie die Abfrage so, dass Sie nur die Ausführung einer SQL-Anweisung mit einer Liste von login-Namen. Bin ich Recht in der Annahme, dass MySql unterstützt ein aray Daten geben? Wenn es nicht (oder Sie verwenden Microsoft SQL), die Sie in Aussehen sollte vorbei in eine Art von durch Trennzeichen getrennte Liste mit Benutzernamen.
Vom diese Diskussion, ist es wahrscheinlich eine gute Idee, überprüfen Sie Ihre paster debug-Protokolle für den Fall, dass es eine bessere Fehlermeldung gibt.