SqlAlchemy:在多行或函数上构建查询是否存在性能差异?

时间:2012-08-14 16:25:40

标签: performance sqlalchemy

如果我使用多个查询对象,代码行或函数来构建我的最终查询,sqlalchemy的效率如何?在执行每一步时是否有性能损失,或者它是否足够聪明以确定发生了什么并且只执行最终查询?

e.g。说我有代码可以做到这一点:

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)

get_dullest_robots()会向数据库发送两个查询而不是一个查询吗?

2 个答案:

答案 0 :(得分:3)

  

执行每一步是否会影响性能,还是足够聪明地弄清楚发生了什么,只执行最终查询?

Query有明确定义的SQL发出点:

  1. 当你迭代它时,就是“对于查询中的项目:”

  2. 致电.all().one()时。 .first().scalar().values().count(),有时.get()

  3. 大多数其他方法都是我们所谓的“生成”,也称为“方法链”。 http://docs.sqlalchemy.org/en/latest/orm/query.html中列出的方法应该提供一个提示,如果没有明确说明,如果你回来了一个具有附加状态的新Query,或者你正在获得SQL发出的结果。

答案 1 :(得分:1)

您可以通过启用sqlalchemy echoing并运行查询来自行检查。当您连接到数据库时,将echo参数传递给create_engine(dbstring, echo=1)

然后运行您的查询。

get_shiniest_robots:

  

INFO sqlalchemy.engine.base.Engine SELECT t_robots.robot_id AS   t_robots_id FROM t_robots JOIN t_spike_maintenance ON   t_robots.robot_id = t_spike_maintenance.robot_id WHERE   t_spike_maintenance。“spike_polish_date”> ?

get_dullest_robots

  

INFO sqlalchemy.engine.base.Engine SELECT t_robots.robot_id AS   t_robots_id FROM t_robots JOIN t_spike_maintenance ON   t_robots.robot_id = t_spike_maintenance.robot_id WHERE   t_robots.robot_id NOT IN(SELECT t_robots.robot_id AS   t_robots_robot_id FROM t_robots JOIN t_spike_maintenance ON   t_robots.robot_id = t_spike_maintenance.robot_id WHERE   t_spike_maintenance。“pike_polish_date”> ?)

你可以看到sqlalchemy正在创建一个子查询,而不是执行两个单独的查询,这似乎是正常的。它只执行一次SQL。