Postgres - 获取分配给变量的查询成本

Tia*_*tas 2 sql postgresql postgresql-9.1

为了获取estimated cost查询的 ,我使用EXPLAIN SELECT column FROM table;,为了获取current cost查询的 ,我使用EXPLAIN ANALYSE SELECT column FROM table;,我的问题是如何cost自动获取查询的 ,而不必explain手动运行每个查询。

我需要类似的东西:

DECLARE cost integer;
DECLARE highercost integer;
DECLARE query text;

highercost := 0;
i := 0;
query = '';

WHILE i < array_length( queryarray ,1) LOOP

    cost := explain analyse queryarray[i];

    IF cost > highercost THEN

        highercost := cost;
        query := queryarray[i];

    END IF;

    i := i+1;

END LOOP;
Run Code Online (Sandbox Code Playgroud)

这个想法是创建一个脚本来检查 a 中的查询log并在 中运行psql,或者将log查询复制到数据库中的表中并运行plain SQL以验证最昂贵的查询,目前正是我所寻求的,无需担心关于cost查询的实际情况(“成本”X“每分钟执行的次数”)、成本INSERTUPDATE成本等等DELETE

我希望这是可能的,如果不可能,还有另一种方法可以搜索昂贵的查询而不需要逐一检查吗?

编辑:

忘记提及,我使用 Postgres 9.1。

Lau*_*lbe 5

也许您可以创建一个类似于以下内容的函数:

\n\n
CREATE OR REPLACE FUNCTION query_cost(\n      queries text[],\n      query OUT text, cost OUT float8, duration OUT float8\n   ) RETURNS SETOF record LANGUAGE plpgsql STRICT AS\n$$DECLARE\n   i integer;\n   p json;\nBEGIN\n   /* loop through input queries */\n   FOR i IN array_lower(queries, 1)..array_upper(queries, 1) LOOP\n      query := queries[i];\n      /* get execution plan in JSON */\n      EXECUTE 'EXPLAIN (ANALYZE, FORMAT JSON) ' || query INTO p;\n      /* extract total cost and execution time */\n      SELECT p->0->'Plan'->>'Total Cost',\n             p->0->'Plan'->>'Actual Total Time'\n         INTO cost, duration;\n      /* return query, cost and duration */\n      RETURN NEXT;\n   END LOOP;\nEND;$$;\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以这样使用它:

\n\n
SELECT *\nFROM query_cost(\n        ARRAY[\n           'SELECT 42',\n           'SELECT count(*) FROM large'\n        ]\n     )\nORDER BY duration DESC;\n\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82           query            \xe2\x94\x82  cost   \xe2\x94\x82 duration \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 SELECT count(*) FROM large \xe2\x94\x82 1693.01 \xe2\x94\x82  150.171 \xe2\x94\x82\n\xe2\x94\x82 SELECT 42                  \xe2\x94\x82    0.01 \xe2\x94\x82    0.002 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n(2 rows)\n
Run Code Online (Sandbox Code Playgroud)\n