【问题标题】:Explain - inserts only one row解释 - 只插入一行
【发布时间】:2015-05-30 06:55:02
【问题描述】:

我正在尝试手动保存优化器计划以供进一步分析,如下所示:

do $$
declare
tmp text;
begin
  explain
    select * from public.some_table where 1=2 into tmp;
  insert into public.plans(plan) values (tmp);
end; $$

但是当我稍后选择它时,我看到它只保存了说明语句中的第一行:

Result  (cost=0.00..82.97 rows=1 width=114)

我怎样才能保存整个计划?

【问题讨论】:

  • 您需要对解释的结果进行循环。计划输出的每一行都是一行。
  • @a_horse_with_no_name 当我尝试执行 (for c in (explain(...)) 时,它给了我语法错误。

标签: sql postgresql postgresql-9.3 explain


【解决方案1】:

因为explain 不能像例如SELECT 这有点棘手,您需要为此使用动态 SQL。

以下内容对我有用:

do
$$
declare
   plan_line record;
begin
   for plan_line in execute 'explain select * from public.some_table where 1=2' loop
      insert into plans values (plan_line."QUERY PLAN");
   end loop;
end;
$$

在字符串中解释语句会使事情变得更复杂一些。

如果我经常需要它,我可能会创建一个执行此操作的函数:

create or replace function explain(to_explain text)
  returns setof text
as
$$
declare
  plan_line record;
begin
   for plan_line in execute 'explain '||to_explain loop
      return next plan_line."QUERY PLAN";
   end loop;
end;
$$
language plpgsql;

然后你可以这样做:

insert into plans 
select * 
from explain('select ...');

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2016-07-01
    相关资源
    最近更新 更多