如何输出"解释分析"结果到表列?

时间:2017-08-09 22:15:42

标签: postgresql plpgsql postgresql-9.3 sql-execution-plan explain

我的 my_table 包含两个文本列: my_query ,其中包含各种文本形式的DML查询;和 my_explanation ,完全填充 nulls

我想做类似的事情:

template<typename T>
void LL<T>::bubbleSortI()
{
bool hasChanged = true;
int swapcount = 0;

while (hasChanged)
{
    int changecount = 0;
    LL_iterator<T> it1 = begin();
    LL_iterator<T> it2 = begin();
    ++it2;

    while(it2!=trailer)
    {
        if (*it1 > *it2)
        {
            it1.swap(it2);
            swapcount++;
            changecount++;
        }
        ++it1;
        ++it2;
    }
    if(changecount==0)
    {
        hasChanged = false;
    }
}
cout << swapcount << " swaps performed on the list. The list is now ordered." << "\n";
}

以便每行上的 my_explanation 列更新为包含 my_query 中包含的查询的解析分析的文本输出列。

我尝试用游标创建一个函数,但它没有用。我还在学习pgplsql。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

EXECUTE是PL / pgSQL语句;它不能在SQL查询中使用,只能在LANGUAGE plpgsql函数或DO block中使用。

您可能想要这样的功能:

CREATE FUNCTION explain_query(sql TEXT) RETURNS SETOF TEXT AS $$
BEGIN
  RETURN QUERY EXECUTE 'EXPLAIN ANALYZE ' || sql;
END
$$
LANGUAGE plpgsql;

由于EXPLAIN会返回多行,因此您需要汇总输出以使其适合my_table中的单个记录:

UPDATE my_table
SET my_explanation = (
  SELECT string_agg(plan, E'\n')
  FROM explain_query(my_query) plan
)