Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中处理执行计划?_Sql_Postgresql_Sql Execution Plan - Fatal编程技术网

如何在PostgreSQL中处理执行计划?

如何在PostgreSQL中处理执行计划?,sql,postgresql,sql-execution-plan,Sql,Postgresql,Sql Execution Plan,在PostgreSQL中,当我运行时: EXPLAIN (FORMAT JSON) SELECT * FROM ACCOUNT WHERE TYPE > 'CHK' 我得到: [ { "Plan": { "Node Type": "Seq Scan", "Parallel Aware": false, "Relation Name": &qu

在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

<代码>解释<代码>在语句之前总是需要去<强>,不能把它放在一个中间。

通过将其包装到函数中,您可以执行所需的操作:

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;

如果无法使用函数,可以将匿名块与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';

然后简单地看第一行。

<代码>解释< /COD>总是需要在<>强>语句之前去<强>,不能把它放在一个中间。

通过将其包装到函数中,您可以执行所需的操作:

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;

如果无法使用函数,可以将匿名块与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
总是需要在查询之前进行。有没有办法在不创建函数的情况下获取值?我想我没有权限。也许会将其保存到临时表中?正如我所写:
explain
总是需要在查询之前执行。