我是数据库方面的新手。而且我的数据库知识很老(大约 MSSQL2000)。我只记得,存储过程比普通查询更快,因为它避免了查询编译和优化。
我知道 PG 有两种类型的查询缓存选项。准备语句(临时缓存查询)和函数(持久缓存查询,在 MSSQL 中是存储过程)。
不管怎样,今天我听到了优化围栏的概念。哪个是优化器将函数视为不透明的黑盒,因此无法优化内部。从概念上讲,它可能是正确的。
即使函数完全只用 PL/pgSQL 编写,这是否正确?或者只是对非 SQL 语言的限制?我有机会通过使用 PL/pgSQL 获得更好的性能吗?
用语言编写的函数
SQL
可以在某些条件下(例如,没有副作用)被“内联”(由优化器决定),在这种情况下,它们将参与查询计划优化。用所有其他语言(包括 PL/pgSQL)编写的函数不会参与主查询的优化,因此它们确实是优化栅栏,正如您所说的那样。另一方面,由 PL/pgSQL 函数运行的查询将在第一次运行时编译和准备,因此该函数的后续调用(即使作为同一顶级查询的一部分)会更快。SQL 函数不会隐式准备它们运行的查询,因此如果 SQL 函数的内联失败,重复调用可能会变慢。
实践中,要看具体情况哪个更快。一般来说,我坚持尽可能使用的基本规则,
LANGUAGE SQL
并且LANGUAGE plpgsql
只在我需要额外的表达能力时使用。但这绝对是一种有用的微优化策略来比较两种语言的实现。