我是 PostgreSQL 的新手,我面临着有关表函数性能的问题。我需要做的是相当于 MSSQL 中的存储过程。经过一些研究,我发现表函数是可行的方法,所以我举了一个例子来使用 plpgsql 创建我的函数。
通过比较执行时间,使用函数比直接调用查询慢 2 倍(查询在函数中完全相同)。
经过一番挖掘,我发现在我的函数中使用 SQL 语言可以大大缩短执行时间(与调用查询的时间完全相同)。阅读本文后,我明白 plpgsql 增加了一点开销,但差异太大而无法解释。
因为我没有使用任何 plpgsql 功能,所以这个解决方案对我来说很好,完全有道理。但是,我想了解为什么会有这种差异。如果我比较执行计划,与执行 GroupAggregate 和一些预排序的 SQL 版本相比,plpgsql 版本执行一些 HashAggregate 和顺序搜索......我确实按照 Laurenz Albe 的建议使用了 auto_explain,我在最后添加了两个执行计划.
为什么相同查询的执行计划与语言的唯一区别如此不同?而且,即使是 SUM 的结果(见下面我的请求)也有显着差异。我知道我使用的是浮点值,因此每次调用之间的结果可能略有不同,但在这种情况下,查询和函数之间的差异约为 ~3,这是出乎意料的(~10001 vs ~9998)。
在使用 2 个表和 2 个函数重现问题的代码下方。
请注意,我使用的是 PostgreSQL 12。
任何解释表示赞赏:) 谢谢。
-- Step 1: Create database
-- Step 2: Create tables
-- table1
CREATE TABLE public.table1(area real, code text COLLATE pg_catalog."default");
-- table 2
CREATE TABLE public.table2(code text COLLATE pg_catalog."default" NOT NULL, surface real, CONSTRAINT table2_pkey …Run Code Online (Sandbox Code Playgroud)