【问题标题】:How do I process execution plan in PostgreSQL?如何在 PostgreSQL 中处理执行计划?
【发布时间】:2021-07-20 18:36:13
【问题描述】:

在 PostgreSQL 中,当我运行时:

EXPLAIN (FORMAT JSON) SELECT * FROM ACCOUNT WHERE TYPE > 'CHK'

我明白了:

[
  {
    "Plan": {
      "Node Type": "Seq Scan",
      "Parallel Aware": false,
      "Relation Name": "account",
      "Alias": "account",
      "Startup Cost": 0.00,
      "Total Cost": 13.25,
      "Plan Rows": 87,
      "Plan Width": 276,
      "Filter": "((type)::text > 'CHK'::text)"
    }
  }
]

如何从那里获得“总成本”?我试过了:

SELECT P -> 'Total Cost' FROM (
  EXPLAIN (FORMAT JSON)
  SELECT * FROM ACCOUNT WHERE TYPE > 'CHK'
) X (P)

但我得到了错误:

ERROR: syntax error at or near "JSON"
  Position: 51
SQLState:  42601

【问题讨论】:

    标签: sql postgresql sql-execution-plan


    【解决方案1】:

    explain 总是需要放在之前声明,不能放在中间。

    你可以通过把它包装成一个函数来做你想做的事:

    create or replace function get_plan_cost(p_sql text)
      returns text
    as
    $$
    declare
      l_result jsonb;
    begin  
      execute 'explain (format json) ' || p_sql
        into l_result;
      return l_result #>> '{0,Plan,"Total Cost"}';
    end;
    $$
    language plpgsql;
    
    select get_plan_cost($$ SELECT * FROM ACCOUNT WHERE TYPE > 'CHK' $$);
    

    如果不能使用函数,可以使用带有 RAISE 语句的匿名块:

    set client_min_messages=notice;
    do
    $$
    declare
      l_sql text := $$ SELECT * FROM ACCOUNT WHERE TYPE > 'CHK' $$;
      l_result jsonb;
    begin  
      execute 'explain (format json) ' || l_sql
        into l_result;
      raise notice 'Cost: %', l_result #>> '{0,Plan,"Total Cost"}';
    end;
    $$
    ;
    

    但与使用相比,这似乎过于复杂:

    explain (format text)
    SELECT * FROM ACCOUNT WHERE TYPE > 'CHK';
    

    然后只看第一行。

    【讨论】:

    • 有没有办法在不创建函数的情况下获取值?我想我没有权限。也许将其保存到临时表中?
    • 正如我所写:explain 总是需要查询之前进行。
    • 只是一个注释。匿名块就像一个魅力。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多