[英]Change the execution plan of query in postgresql manually?
是否可以在postgresql中手动更改执行计划的操作顺序? 例如,如果我总是希望在过滤之前进行排序操作(尽管在正常使用postgresql时没有意义),是否可以通过例如更改操作的内部成本来手动强制执行?
如果我实现自己的功能怎么样? 是否有可能始终在sql语句的最后执行这样的函数?
使用子查询或CTE首先强制执行某些操作。 喜欢:
SELECT *
FROM (
SELECT *
FROM tbl
LIMIT 10
) x
ORDER BY 1;
当然,你需要了解自己在做什么。 在示例中,我选择10个任意行,然后按第一列排序。
您可以连续使用多个子查询层或多个CTE。
与CTE相同的例子:
WITH x AS (
SELECT *
FROM tbl
LIMIT 10
)
SELECT *
FROM x
ORDER BY 1;
对于简单查询,子查询通常更快,CTE提供其他功能(例如在不同查询级别的多个位置重用相同的CTE)。
有更多的方法 - 有些是在这里展示的,但还有第二种方法,如果你想在处理结束时移动函数调用,那么只需将COST设置为更高的值。 自定义函数的默认值为100,但您可以设置更高的值。
CREATE OR REPLACE FUNCTION public.test()
RETURNS integer
LANGUAGE plpgsql
IMMUTABLE COST 1000 -- very expensive function
AS $function$
declare i int;
declare j int;
begin
i := 1;
while i < 10000 loop
j := 1;
while j < 1000 loop
j := j + 1;
end loop;
i := i + 1;
end loop;
return i;
end;
$function$
如果没有CTE(其他人已经解释过),你可以做的最好的事情是关闭某些类型的操作。 这通常被认为是危险的,并且是一种不得已的方法,因为它通常指向数据库中的错误(即缺少索引,不抽真空,分析采样太低)或PostgreSQL代码。
但是如果你想尝试一下,请查看“enable_seqscan”和其他设置,例如参见PostgreSQL文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.