【问题标题】:SQLAlchemy query result time outSQLAlchemy 查询结果超时
【发布时间】:2013-10-14 08:37:20
【问题描述】:

我正在开发一个 Extjs 4 应用程序,我使用从 GUI 发送的参数(文本框、组合框值等)执行查询。 该查询是使用 SQLAlchemy 构建的。我在 localhost 上使用 MySQL 数据库。

我执行的查询旨在返回大数据。我的问题是,当我直接在 HeidiSQL 上执行查询时,它会在 0.6 秒内执行,但是使用 Extjs(在 chrome 上)它会产生超时并且不显示任何结果。

这是查询。当我执行它时,它应该返回 300.000 行。

SELECT  /*ALL OF THE COLUMNS OF MY TWO TABLES, GENERATED DYNAMICALLY WITH SQLAlchemy*/
FROM bl, `CR`
WHERE `CR`.`Category` IN ('Failure') AND bl.severity_logged IN ('4_minor') AND bl.product_logged = 'x' AND bl.`productRelease_logged` IN ('0.1', '6.2', '6.4', '6.7');

可能是什么问题? 是浏览器缓存问题吗?

编辑:这是我的带有 SQLAlchemy 的 Python 脚本。

engine = create_engine(
             "mysql://:@localhost/test",
             isolation_level="READ UNCOMMITTED"
        )
meta = MetaData(bind=engine)
meta.reflect(bind=engine)
cr =  meta.tables['cr']
bl = meta.tables['bl']

session = create_session(bind=engine)
...#I create filters based on the GUI values
test_query = session.query(metric_table_object,cr).filter(all_filters) #I then create the query
result_dict = [u.__dict__ for u in test_query.all()] #I store the query result into a dict
print result_dict

【问题讨论】:

  • 您确定要关闭所有以前的会话吗?使用 session.close(),如果你可以打印你的代码,它会容易得多。
  • 我不使用 session.close(),我应该把它放在哪里?直接声明session = create_session(bind=engine)?
  • 我已经用 Python 代码更新了我的问题。
  • 查询开始返回结果和返回所有行所用的时间有很大差异。 300K 行是 a lot。这可能需要很长时间,甚至可能会破坏内存,请查看 RAM 使用情况等等。
  • 是的,数组中有 300K ORM 对象,这在 CPU 和内存方面都是巨大的 Python 开销。我会找到一种不同的方法来实现你想要的,而不是将 300K 行加载到内存中,你是否试图生成某种报告文件,你需要一次所有这些行?

标签: python mysql sql extjs sqlalchemy


【解决方案1】:

作为zzzeek comments,加载 300,000 个结果对象可能会占用过多内存。也许您可以使用Windowed Range Query 之类的策略分块处理数据? This post on the SqlAlchemy mailing list 还提供了一些关于将结果分割成块的有用细节。

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多