1

ユーザー名に対して 40K のリクエストを実行する必要があります。

SELECT * from user WHERE login = :login

遅いので、準備済みステートメントを使用するだけだと考えました。

私もです

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()

しかし、私は持っています:

InterfaceError: (InterfaceError) cursor already closed None None

例外が発生する理由がわかりません

4

2 に答える 2

2

SELECT * from user WHERE login = $loginカーソル関連のエラー メッセージを解決する方法がわかりませんが、SQL Server 2005 以降を使用している場合、実行計画が既に再利用されており、パフォーマンスが向上しない限り、準備済みのステートメントでパフォーマンスの問題が解決するとは思いません。準備されたステートメントから得ます。MySql やその他の SQL データベース サーバーについては知りませんが、準備されたステートメントを冗長にするアドホック クエリに対して同様の最適化が行われているのではないかと思います。

パフォーマンス ヒットの原因は、データベースに対して 40,000 回の往復を行っているという事実にあるようです。ログイン名のリストを使用して 1 つの SQL ステートメントのみを実行するように、クエリを書き直してください。MySql が配列データ型をサポートしていると考えるのは正しいですか? そうでない場合 (または Microsoft SQL を使用している場合) は、ある種のユーザー名の区切りリストを渡すことを検討する必要があります。

于 2009-06-29T13:12:23.940 に答える
1

この議論から、より良いエラー メッセージがある場合に備えて、paster のデバッグ ログを確認することをお勧めします。

于 2009-06-29T12:54:30.933 に答える