更改PostgreSQL中查询的执行计划?[英] Change the execution plan of query in postgresql manually?

本文是小编为大家收集整理的关于更改PostgreSQL中查询的执行计划?的处理方法,想解了更改PostgreSQL中查询的执行计划?的问题怎么解决?更改PostgreSQL中查询的执行计划?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

是否可以在PostgreSQL中手动更改执行计划的操作顺序?例如.如果我总是想在过滤之前进行订购操作(尽管在PostgreSQL的正常使用中没有意义),那么可以通过例如手动执行该操作.改变操作的内部成本?

如果我实现自己的功能怎么办?是否可以在SQL语句末尾执行此类函数?

推荐答案

还有更多方法 - 这里显示了一些方法,但是有第二种方法,如果您要在处理结束时移动函数,则只需将成本设置为更高的价值即可.自定义功能的默认值为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 首先强制某些操作.喜欢:

SELECT *
FROM  (
   SELECT *
   FROM   tbl
   LIMIT  10
   ) x
ORDER  BY 1;

当然,您需要了解您在做什么.在示例中,我选择10 nutyary 行,然后通过第一列订购.
您可以连续使用多个子征服或多个CTE.

与CTE相同的例子:

WITH x AS (
   SELECT *
   FROM   tbl
   LIMIT  10
   )
SELECT *
FROM   x
ORDER  BY 1;

通常用于简单查询的子查询,CTE提供了其他功能(例如,在不同查询级别的多个位置重复使用相同的CTE).

其他推荐答案

关于您没有CTE(其他人解释的)可以做的最好的方法是关闭某些类型的操作.这通常被认为是危险的,也是最后一种方法的方法,因为它通常指向数据库中的错误(即缺乏索引,不够吸尘,分析采样太低)或PostgreSQL代码中的错误.

.

但是,如果您想尝试一下,请查找" enable_seqscan"和其他设置,请参见例如. postgresql document .

本文地址:https://www.itbaoku.cn/post/1763932.html