gpt4 book ai didi

python - 使用 sqlalchemy session 执行 sql DRASTICALLY 会减慢执行时间

转载 作者:可可西里 更新时间:2023-11-01 07:18:30 26 4
gpt4 key购买 nike

我有一个相当长的查询(是 7 个连接,现在是 7 个子选择,因为在原始 sql 中,7 个子选择要快得多——我什至不知道如果我让它运行,7 个连接什么时候完成,但长于 1 分钟,而子选择为 0.05-0.1 秒)

当我在数据库上运行它时,如我所说,执行时间为 0.05-0.1 秒。只需使用 session.execute() 即可将其速度减慢一分多钟!

有什么我可以做的吗?

如果您需要更多信息,请告诉我——我有点怀疑这是一个普通的 sqlalchemy 事情——比如 sqlalchemy 可能正在设置一个查询计划,而不是让 mysql 执行它?或者……?

编辑:对两者进行解释,它们看起来相同,只是 sqlalchemy 添加了“使用临时文件;使用文件排序”到 extra 列。这就是它减慢速度的原因吗?我如何阻止它这样做?

编辑 2:绝对是 sqlalchemy。我尝试使用 MySQL 游标而不是 SA session 来执行并获得相同的 0.05 秒运行时间。

编辑 3:

创建引擎的代码:

engine_ro = create_engine(
config.ro_database_url, #string with username, password, db
pool_size=config.database_pool_size, #int
max_overflow=config.database_max_overflow, #int
pool_timeout=config.database_timeout, # int
echo=config.database_echo, #False
echo_pool=config.database_echo, #same as echo #False
listeners=[GoneAway()] if config.database_use_listeners else None)

其中 GoneAway() 是执行 SELECT 1 以检查连接的方法。

创建 session 对象:

SessionRO = scoped_session(sessionmaker(bind=engine_ro, autocommit=False))

其中 scoped_sessionsessionmaker 是 sqlalchemy 函数。

然后,执行查询的代码:

session = SessionRO()
results = session.execute(sql, params)

编辑 4:如果有人想知道,如果我注释掉 listeners 位,它仍然很慢。如果我只是使用 sessionmaker 而没有 scoped_session。

最佳答案

sqlalchemy 不设置查询计划或任何其他花哨的东西。它只是生成 SQL 并通过 DB-API-2.0 连接发送它。因此,如果您使用 sqlalchemy 生成的相同语句显式调用 execute,它将以完全相同的方式运行。*

查看 sqlalchemy 正在生成哪些查询的最简单方法是将 echo=True 作为 create_engine 调用的额外参数传递。

在您的情况下,sqlalchemy 生成的查询实际上与您的手动查询不同,因为它使用字符串而不是 int 测试整数参数。


* 这不是 100% 保证;您必须确保 DB-API-2.0 connect 函数中的任何连接参数都相同,并且您和 sqlalchemy 都没有执行任何 PRAGMA语句。但是您可以像测试查询本身一样测试它们。

关于python - 使用 sqlalchemy session 执行 sql DRASTICALLY 会减慢执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16488910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com