我有一个问题。我有一个名为 update 的路由,用户请求它具有偏移量和限制(限制是 200,并且我有超过 200,000 条记录,因此可以调用 1,000 次)。该路由使用带有偏移量和限制的 PostGraphile 查询,该查询调用名为 search_users 的 PostgreSQL 函数,该函数执行需要 5 秒。
我们遇到了问题,因为我认为数据库函数被再次调用并重新计算每个更新请求(具有不同的偏移量)。这样,该函数每次都会计算所有 200,000 条记录,即使我每个请求只需要 200 条记录。
我正在想办法做什么。 search_users 函数包含一个 ORDER BY 子句(我理解这是必要的,因为在 PostgreSQL 函数中使用分页时 SELECT 无法保证相同的顺序)。
在我看来,我们需要首先提取所有记录,并使用记住某些更新请求之间的函数调用的东西(我认为默认情况下不存在)。
我很高兴能有技术解决方案来解决问题或任何我不知道的问题。
我尝试提高每个请求的限制以减少负载,但我不确定我的服务器是否可以在不分页的情况下处理 200,000 条记录。我也尝试寻找改进功能本身的方法。我考虑过使用物化视图和索引来保存调用之间的函数计算结果,但我不太确定该怎么做。
您可以在构建物化视图期间使用 row_number()
函数和每页的行数为行分配特定的
page编号。类似于:(参见domo)
-- create materialized view with 'page' number
create materialized view <mat_view>( <list of columns>
, page
) as
select *
, 1+(row_number() over())/2000 -- assign page number with 2000 items per page
from (select <list of columns>
from <source_table)
order by <column list>
);
注意:演示生成 10010 行,页面大小为 20。
警告
物化视图在刷新之间是静态的。这意味着应用于基础表的任何 DML 等陈旧数据将不会在刷新之间反映出来。此外,每个周期的刷新很可能不会提高性能。您需要确定允许陈旧数据的时间范围,以及刷新间隔。