Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SqlAlchemy:在多行或多个函数上构建查询是否存在性能差异?_Performance_Sqlalchemy - Fatal编程技术网

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

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

如果我使用几个查询对象、代码行或函数来构建最终查询,那么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)

机器人会向数据库发送两个查询而不是一个查询吗?

您可以通过打开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发出的结果,则在中列出的方法应该给出提示


这是我从自己的研究中发现的,但我想看看我是否错了,或者是否有人有更好的答案。这是我从自己的研究中发现的,但我想看看我是否错了,或者是否有人有更好的答案。