sql >> Databáze >  >> RDS >> PostgreSQL

Srovnávání mnoha PostgreSQL dotazů

S vkládáním EXPLAIN není problém v PL/pgSQL:

CREATE OR REPLACE FUNCTION profile(
      IN query text,
      OUT total_cost double precision,
      OUT runtime double precision
   ) RETURNS record
  LANGUAGE plpgsql STRICT AS
$$DECLARE
   j json;
BEGIN
   EXECUTE 'EXPLAIN (ANALYZE, FORMAT JSON) ' || query INTO j;
   total_cost := (j->0->'Plan'->>'Total Cost')::double precision;
   runtime := (j->0->'Plan'->>'Actual Total Time')::double precision;
   RETURN;
END;$$;

Můžete jej použít například takto:

test=> SELECT * FROM profile($$SELECT * FROM large WHERE val = 'mama'$$);
┌────────────┬─────────┐
│ total_cost │ runtime │
├────────────┼─────────┤
│   14542.43 │ 207.836 │
└────────────┴─────────┘
(1 row)

Nepoužívejte ji s nedůvěryhodnými dotazy, protože funkce je zranitelná vůči SQL injection.




  1. Nejlepší postup pro ukládání značek do databáze?

  2. poddotaz vrátí více než 1 řádek

  3. Proč Mysql používá úplné skenování tabulky pro tabulku A, když se připojuje k jiné tabulce B?

  4. Dynamicky filtrujte DataGrid pro název pomocí TextBox