【问题标题】:Difference between Sqlalchemy execution time and execution time from EXPLAIN query?Sqlalchemy 执行时间和 EXPLAIN 查询执行时间的区别?
【发布时间】:2016-11-01 00:41:18
【问题描述】:

我正在使用带有 Flask 和 sqlalchemy 的 postgresql。 我发现如果我在 python 中做类似的事情,

t1 = datetime.datetime.now()
session.query(Table_Class).all()
t2 = datetime.datetime.now()
print (t2 - t1)

我正在获取 sqlalchemy 查询的执行时间。 但是,如果我去 postgresql 并使用 EXPLAIN ANALYZE 编写相同的 sql 语句,那么我也可以获得 sql 查询的执行时间。喜欢,

EXPLAIN ANALYSE select * from table;

我发现这些执行时间之间的差异很大。 sqlalchemy 的执行时间几乎是 EXPLAIN 查询的执行时间的 10 倍。对于小型查询,两次是(75 毫秒和 2 毫秒),对于具有许多连接的长查询,时间是(1.5 秒和 200 毫秒)。我不知道为什么会这样。为什么这些时间相差很大?

【问题讨论】:

  • 您确定 SQLAlchemy 生成与您在 postgres 控制台中键入的查询相同的查询吗?例如,如果您有急切加载,session.query(TableClass) 也将执行连接并生成 select * from a join b join c...
  • 是的,SQLAlchemy 生成的和我在 postgres 控制台中输入的一样。我通过设置SQLALCHEMY_ECHO=True 确认了它

标签: python postgresql flask sqlalchemy explain


【解决方案1】:

差异可能是由通信开销引起的。当您运行解释分析时,您正在测量 postgres 数据库中查询的确切时间。当您在 python 代码中测量时间时,您正在测量查询执行的时间加上:连接到数据库、发送数据、接收/解析结果等的时间。取决于传输的数据量和物理与查询的实际执行时间相比,您的数据库位置可能会产生很大的通信开销。

【讨论】:

  • 是的,我同意会有开销时间,但我不希望它以秒为单位。就我而言,对于长连接的大查询,它会超过 1 秒。
  • @Rohanil 您从数据库中检索了多少行?数据库是否在另一台服务器上?你在使用连接池吗?
  • 我正在从 db 中检索大约 1000 行,并且数据库在同一台服务器上。对于 1000 行的小查询,时间是(75 毫秒和 2 毫秒),对于返回 1000 行但有很多连接的大查询,时间是(1.5 秒和 200 毫秒)。
  • 如果它只有 1000 行并且它位于同一台服务器上,它确实不应该有那么多开销。也许调试的方法可能是从仅返回 1 个元素的非常简单的查询开始,或者甚至是在 python 中进行的简单SELECT 1; 查询,以查看可能导致 issoe @Rohanil 的原因
  • " 对于 1000 行的小查询,时间是(75ms 和 2ms),对于返回 1000 行的大查询," 小查询和大查询有相同的行数?
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2011-07-19
  • 2020-12-07
  • 1970-01-01
  • 2015-07-22
  • 2016-11-10
  • 2011-04-03
  • 2013-02-23
相关资源
最近更新 更多