【问题标题】:Execute a prepared statement in sqlalchemy在 sqlalchemy 中执行准备好的语句
【发布时间】:2010-11-06 16:19:57
【问题描述】:

我必须针对用户名运行 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

我不明白为什么会出现异常

【问题讨论】:

  • 为我工作。您使用的是什么版本,0.5 (r5236) 之前的游标处理略有变化,可以解决此问题。但即使它有效,我也非常怀疑解析和规划开销是否足够大,以至于它真的很重要。如下所示,更好地批量处理。

标签: python sqlalchemy


【解决方案1】:

来自this discussion,最好检查您的粘贴调试日志,以防有更好的错误消息。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不在网络环境中。它是一个独立的应用程序,将 ldap 目录与 postgresql 数据库同步。该请求只是一个例子。我也有多个连接和 where 子句的请求。您会考虑在这种情况下提高性能吗?
    • 即使数据库服务器是本地的(无论是在网络本地,还是在同一台物理机上),每个请求仍然会有相关的开销,对于简单的查询,这个开销会比较大与执行实际查询所需的工作相比。一起批处理查询的其他原因是它可以帮助数据库服务器更好地优化查询。
    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2012-02-16
    • 1970-01-01
    相关资源
    最近更新 更多