相关疑难解决方法(0)

基于函数值的递归 CTE 在 Postgres 12 上明显慢于 11

跟进我关于 Postgres 12 中的某些查询比 11 中的查询慢的问题,我认为我能够缩小问题的范围。似乎基于函数值的递归 CTE 是有问题的地方。

我能够分离出一个相当小的 SQL 查询,它在 Postgres 12.1 上运行的时间比在 Postgres 11.6 上运行的时间要长得多,例如 Postgres 12.1 中的大约 150 毫秒与 Postgres 11.6 中的大约 4 毫秒。我能够在各种系统上重现这种现象:在 VirtualBox 中的多个 VM 上;通过两台不同物理机器上的 Docker。(有关 docker 命令,请参阅附录)。然而,奇怪的是,我无法在https://www.db-fiddle.com/上重现它(在那里看不到区别,两者都很快)。

现在进行查询。首先,我们创建这个简单的函数

CREATE OR REPLACE FUNCTION public.my_test_function()
 RETURNS SETOF record
 LANGUAGE sql
 IMMUTABLE SECURITY DEFINER
AS $function$ 

SELECT 
        1::integer AS id,
        '2019-11-20'::date AS "startDate",
        '2020-01-01'::date AS "endDate"

$function$;
Run Code Online (Sandbox Code Playgroud)

然后对于实际查询

WITH  "somePeriods" AS  (
      SELECT * FROM my_test_function() AS 
      f(id integer, "startDate" date, "endDate" …
Run Code Online (Sandbox Code Playgroud)

postgresql cte recursive postgresql-12 postgresql-performance

5
推荐指数
1
解决办法
1639
查看次数

Postgres 12 的 NOT MATERIALIZED 指令有副作用吗?

我正在对我公司的一些 SQL 进行一些性能基准测试,将 PG10 与 PG12 进行比较。我们在代码中使用了很多CTE,而 PG12 并没有对 CTE 进行原生优化,因此 PG10 和 PG12 之间的性能是相同的。

我的下一个实验是将NOT MATERIALIZED指令添加到 CTE,结果令人震惊:它大大缩短了查询时间(在某些情况下将它们减半)。

在这里读到这MATERIALIZED是 PG12 之前的默认功能。该功能会将 CTE 的所有内容写入一个临时位置。

所以我的问题主要是NOT MATERIALIZED

  1. 与 相比,该NOT MATERIALIZED功能对幕后的数据MATERIALIZED有何作用?
  2. NOT MATERIALIZED在重构我们的代码库之前,我应该注意哪些副作用?

postgresql optimization execution-plan postgresql-12

3
推荐指数
1
解决办法
1439
查看次数