繁体   English   中英

手动更改postgresql中的查询执行计划?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM