在 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()”对性能有何影响?的主要内容,如果未能解决你的问题,请参考以下文章