Performance SqlAlchemy:在多行或多个函数上构建查询是否存在性能差异?
如果我使用几个查询对象、代码行或函数来构建最终查询,那么sqlalchemy的效率有多高?它在执行每一步时是否会对性能造成影响,或者它是否足够聪明,能够弄清楚发生了什么,并且只执行最终的查询 e、 g.假设我有这样做的代码:Performance SqlAlchemy:在多行或多个函数上构建查询是否存在性能差异?,performance,sqlalchemy,Performance,Sqlalchemy,如果我使用几个查询对象、代码行或函数来构建最终查询,那么sqlalchemy的效率有多高?它在执行每一步时是否会对性能造成影响,或者它是否足够聪明,能够弄清楚发生了什么,并且只执行最终的查询 e、 g.假设我有这样做的代码: get_shiniest_robots(self, polish_date): """Get robot_ids for robots with recently polished spikes.""" return session.query(Robots
get_shiniest_robots(self, polish_date):
"""Get robot_ids for robots with recently polished spikes."""
return session.query(Robots.robot_id).filter_by(spike_polish_date > polish_date)
然后我有另一个函数
get_dullest_robots(self, polish_date):
"""Get robot_ids for robots that have not been polished lately."""
return session.query(Robots.robot_id).filter_by(~Robots.robot_id.in_(get_shiniest_robots(polish_date))).values(Robots.robot_id)
机器人会向数据库发送两个查询而不是一个查询吗?您可以通过打开sqlalchemy回声并运行查询来检查这一点。当您连接到数据库时,使用类似create_enginedbstring的内容传递echo参数,echo=1 然后运行查询 获取最闪亮的机器人: 信息sqlalchemy.engine.base.engine选择t_robots.robot_id作为 来自t_robots的t_robots的t_id加入t_spike_维护 t_robots.robot_id=t_spike_maintenance.robot_id在哪里 t_spike_maintenance.spike_polish_date> 让机器人变得最迟钝 信息sqlalchemy.engine.base.engine选择t_robots.robot_id作为 来自t_robots的t_robots的t_id加入t_spike_维护 t_robots.robot_id=t_spike_maintenance.robot_id在哪里 t_robots.robot_id不在选择t_robots.robot_id为 t_robots_robot_id来自t_robots加入t_spike_维护 t_robots.robot_id=t_spike_maintenance.robot_id在哪里 t_spike_maintenance.pike_polish_date>
您可以看到sqlalchemy正在创建一个子查询,而不是执行两个单独的查询,这似乎很正常。它只执行SQL一次。您可以通过打开sqlalchemy回显并运行查询来自己检查这一点。当您连接到数据库时,使用类似create_enginedbstring的内容传递echo参数,echo=1 然后运行查询 获取最闪亮的机器人: 信息sqlalchemy.engine.base.engine选择t_robots.robot_id作为 来自t_robots的t_robots的t_id加入t_spike_维护 t_robots.robot_id=t_spike_maintenance.robot_id在哪里 t_spike_maintenance.spike_polish_date> 让机器人变得最迟钝 信息sqlalchemy.engine.base.engine选择t_robots.robot_id作为 来自t_robots的t_robots的t_id加入t_spike_维护 t_robots.robot_id=t_spike_maintenance.robot_id在哪里 t_robots.robot_id不在选择t_robots.robot_id为 t_robots_robot_id来自t_robots加入t_spike_维护 t_robots.robot_id=t_spike_maintenance.robot_id在哪里 t_spike_maintenance.pike_polish_date> 您可以看到sqlalchemy正在创建一个子查询,而不是执行两个单独的查询,这似乎很正常。它只执行SQL一次 它在执行每一步时是否会对性能造成影响,或者它是否足够聪明,能够弄清楚发生了什么,并且只执行最终的查询 查询具有定义良好的点,在这些点上发出SQL: 当您对其进行迭代时,即对于查询中的项: 当你打电话的时候,所有人,一个。首先,.scalar,.values,.count,有时还有.get 大多数其他方法都是我们称之为生成的方法,也称为方法链接。如果不是显式的,如果您要返回一个带有附加状态的新查询,或者如果您要返回SQL发出的结果,则在中列出的方法应该给出提示 它在执行每一步时是否会对性能造成影响,或者它是否足够聪明,能够弄清楚发生了什么,并且只执行最终的查询 查询具有定义良好的点,在这些点上发出SQL: 当您对其进行迭代时,即对于查询中的项: 当你打电话的时候,所有人,一个。首先,.scalar,.values,.count,有时还有.get 大多数其他方法都是我们称之为生成的方法,也称为方法链接。如果不是显式的,如果您要返回一个带有附加状态的新查询,或者如果您要返回SQL发出的结果,则在中列出的方法应该给出提示
这是我从自己的研究中发现的,但我想看看我是否错了,或者是否有人有更好的答案。这是我从自己的研究中发现的,但我想看看我是否错了,或者是否有人有更好的答案。