资讯专栏INFORMATION COLUMN

sqlalchemy使用count时遇到的坑

马永翠 / 615人阅读

摘要:在用对一个千万级别表进行操作时,出现了耗时严重内存飙升的情况。

在用flask-sqlalchemy对一个千万级别表进行count操作时,出现了耗时严重、内存飙升的情况。
要统计出一天内车辆访问次数,原代码如下:

car_visit_counts = CarVisit.query.filter(
    CarVisit.park == car_visit.park,
    CarVisit.plate_number == car_visit.plate_number,
    CarVisit.visited_at >= today_start_time(),
).count()

发现代码运行特别慢,所以把生成的sql打印出来看一下:

SELECT
          COUNT(*) AS count_1
FROM
          (
                    SELECT
                              car_visits.id                            AS car_visits_id
                            , car_visits.park_id                       AS car_visits_park_id
                            , car_visits.store_id                      AS car_visits_store_id
                            , car_visits.car_id                        AS car_visits_car_id
                            , car_visits.brand_id                      AS car_visits_brand_id
                            , 
                            ...
                    FROM
                              car_visits
                    WHERE
                              %(param_1)s                 = car_visits.park_id
                              AND car_visits.plate_number = %(plate_number_1)s
                              AND car_visits.visited_at  >= %(visited_at_1)s
          )
          AS anon_1

可以发现进行了一次子查询,这样的话会生成临时表,效率低下,将原语句改变一下:

car_visit_counts = db.session.query(func.count(CarVisit.id)).filter(
    CarVisit.park == car_visit.park,
    CarVisit.plate_number == car_visit.plate_number,
    CarVisit.visited_at >= today_start_time(),
).scalar()

此时在看一下打印的sql语句:

SELECT
          COUNT(car_visits.id) AS count_1
FROM
          car_visits
WHERE
          %(param_1)s                 = car_visits.park_id
          AND car_visits.plate_number = %(plate_number_1)s
          AND car_visits.visited_at  >= %(visited_at_1)s

子查询消失了,速度也快了好多。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43968.html

相关文章

  • 一次使用 SQLAlchemy 实现分类以及计数的业务过程

    摘要:在编写业务逻辑代码的时候我不幸遇到下面的表结构已经将主要逻辑抽离出来了分类分类名称产品产品名称分类现在需要实现的业务是返回分类的列表结果分类这是一个一对多的模型一般的笨拙思路就是明眼人一看就知道可以把换成但是根据这篇文章似乎这样写会有更好的 在编写业务逻辑代码的时候, 我不幸遇到下面的表结构(已经将主要逻辑抽离出来了): class Category(Model): __tab...

    airborne007 评论0 收藏0
  • Flask-SQLAlchemy 学习总结

    摘要:初始化和配置对象关系映射。的则需要在中声明。例如配置信息中指出是可以绑定多个数据库引擎。是通过解决一对多的关系。将会返回学院学生人数将会返回学生的学院信息的类实例。处理关系对象查询中有详细的说明。 初始化和配置 ORM(Object Relational Mapper) 对象关系映射。指将面对对象得方法映射到数据库中的关系对象中。Flask-SQLAlchemy是一个Flask扩展,能...

    whataa 评论0 收藏0
  • Essential SQLAlchemy2th学习笔记之ORM模块

    摘要:你应该使用工厂类来创建类,因为这确保了配置参数的正确性。对象包含创建数据库连接所需的一切信息,它不会立即创建连接对象,而是会在我们进行具体操作时创建。注意生产环境不要使用这个选项。关于选择的最佳实践使用迭代方式获取所有值,而不是。 定义模式Defining Schema 定义ORM类的4个步骤: 继承declarative_base()函数返回的类 定义__tablename__属性...

    JasonZhang 评论0 收藏0
  • 基于 oracle 的 flask 项目(二)——用户登录

    摘要:自行定义的方法用于权限判断继承至该类的用户模型将作为未登陆时的用户模型可以保持代码的一致性。但是这样的方法很危险,很造成一些其它项目的兼容性问题。打开页面,显示正常。 flask 相对于很多国企的 oracle 数据库而言,是比较新的,因此很多古老的设计并不一定适合较新的 flask 的标准,但作为后来者,你得向前兼容,你得适应需求。本章内容就来解释一下上一章——基于 oracle 的...

    chunquedong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<