如何优化 DAL web2py 查询?

How can I optimize DAL web2py query?

result = db((db.company.location.belongs(locations)) &
            (db.company.emp_id.belongs(employee_ids)) &
            (db.company.type.belongs(types))).select()

locations 是位置 ID 列表

employee_ids 是员工 ID 列表

types = ['General', 'office', 'e-commerce']

此查询 return 60,000 条记录,需要 1 分钟才能完成。我该如何优化或拆分它?

您的 DAL 查询需要大约 1 分钟的原因是因为 .select() 方法的 return 是一个 Rows 实例,其中包含 60,000 个 Row 对象。这些 类 的许多实例化都包含在耗时和内存消耗的操作中。 作为解决方案,您可以:

  • 使用 limit by 参数将该查询拆分为 X 部分:.select(limitby=(0, X)) 或;
  • 使用 executesql db().executesql(SELECT * FROM...) 使用 SQL 构造您的查询。 return 将是元组,没有任何 Row 或 Rows 实例化并且它更快,但是您将无法享受 Row 对象的好处;

如果以上任何一个解决了你的问题,并且你有一个非常耗时的操作,你可以尝试将拆分解决方案与线程一起使用。

我找到了解决方案。

公司 table 有 20 列。 查询中没有指定select哪些字段,查询returns60,000条记录,每条记录有20个字段。

我通过 select 仅对需要的列进行优化查询。

我只需要 id 和 name。所以我将查询更改为以下,现在查询只需要 10 秒(之前是 60 秒):

result = db((db.company.location.belongs(locations)) &
            (db.company.emp_id.belongs(employee_ids)) &
            (db.company.type.belongs(types))).select(db.company.id, db.company.name)