如何优化 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)
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)