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

不知道如何解决与光标相关的错误消息,但我认为准备好的状态不会解决您的性能问题 - 只要您使用 SQL Server 2005 或更高版本,执行计划SELECT * from user WHERE login = $login就已经被重用并且不会有性能从准备好的陈述中获益。我不了解 MySql 或其他 SQL 数据库服务器,但我怀疑它们也对 Ad-Hoc 查询进行了类似的优化,从而使准备好的语句变得多余。

听起来性能下降的原因更多是因为您对数据库进行了 40,000 次往返 - 您应该尝试重写查询,以便只执行一个带有登录名列表的 SQL 语句。我认为 MySql 支持 aray 数据类型是否正确?如果没有(或者您使用的是 Microsoft SQL),您应该考虑传入某种分隔的用户名列表。

于 2009-06-29T13:12:23.940 回答
1

这个讨论中,检查您的粘贴调试日志可能是一个好主意,以防那里有更好的错误消息。

于 2009-06-29T12:54:30.933 回答