微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL 中如何处理执行计划?

如何解决PostgreSQL 中如何处理执行计划?

在 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

解决方法

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,"Total Cost"}';
end;
$$
;

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

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

然后只看第一行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。