在 web2py 中使用“rows.render()”对性能有何影响?

Posted

技术标签:

【中文标题】在 web2py 中使用“rows.render()”对性能有何影响?【英文标题】:What performance hit does using "rows.render()" have in web2py? 【发布时间】:2020-11-04 21:01:26 【问题描述】:

我发现使用http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer?search=lazy#Rendering-rows-using-represent 中描述的“表示”功能会大大降低处理速度 - 处理某些表格所需的时间增加了一倍以上。这是一种耻辱,因为这个选项使得从非常简单的表 SELECT 中获取人类可读的数据变得非常容易。

我认为这种性能是可以预期的,因为我假设它为每条记录发出一个 SELECT 以获取 Represents 值。因此,我有 1 个 SELECT 用于我的一组(例如 100 条记录),然后还有另外 100 多个 SELECTS 用于在我访问这些记录时获取一个或多个相关表中的字段的表示值。

关于如何提高 render() 函数性能的任何提示? 或者我应该期望 render() 选项迟缓吗? 为了获取代表数据,是否是使用必要连接构建查询的唯一替代方法?

谢谢

【问题讨论】:

【参考方案1】:

默认情况下,引用具有定义的format 属性的相关表的reference 字段将获得确实选择相关记录的represent 函数(然后将format 函数/规范应用于检索记录),导致您观察到的“N+1”查询问题。

如果您仍然想使用rows.render() 来应用不涉及数据库选择的其他类型字段的represent 函数,您可以通过显式删除默认的@987654328 来消除reference 字段的问题@属性:

Field('other_table', 'reference other_table', represent=None)

当然,在这种情况下,您不会得到 other_table 字段的格式良好的表示。正如您所建议的,在这种情况下,更有效的替代方法是构建一个连接相关表的查询。

【讨论】:

谢谢安东尼。有些表格我没有显示参考字段,因此我可以删除其中一些。我可能会看看这是否有帮助。 您也可以简单地从查询中完全排除参考字段,在这种情况下,调用rows.render() 不会对参考字段做任何事情。 感谢您的提示。我的查询目前还很初级,因此它包括所有字段。我可以调整它。

以上是关于在 web2py 中使用“rows.render()”对性能有何影响?的主要内容,如果未能解决你的问题,请参考以下文章

使用 web2py 修改 SQL 表模式

有人在使用 web2py 吗? [关闭]

将 MySQL 查询转换为在 web2py DAL 中使用

在 Web2py 中使用 lambda 作为模型默认值

如何在 web2py 中定义自定义主键

孙子中的 web2py 表示“格式”