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“每分钟执行的次数”)、成本INSERT
、UPDATE
成本等等DELETE
。
我希望这是可能的,如果不可能,还有另一种方法可以搜索昂贵的查询而不需要逐一检查吗?
编辑:
忘记提及,我使用 Postgres 9.1。
也许您可以创建一个类似于以下内容的函数:
\n\nCREATE 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\nSELECT *\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
归档时间: |
|
查看次数: |
1283 次 |
最近记录: |