Re: Query Plan Columns

From: "David E(dot) Wheeler" <david(at)kineticode(dot)com>
To: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Query Plan Columns
Date: 2010-11-08 23:12:35
Message-ID: 5A8ABDFC-B106-4ACB-9391-9E191B16CA60@kineticode.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Nov 7, 2010, at 5:24 AM, Roberto Mello wrote:

> Yes, but I am wondering whether you should just stick to what would
> come out of a normal explain, for consistency sake. Maybe provide
> another function, or parameter that would cast the results to
> intervals?

I think it's more convenient to have intervals.

So my final list:

CREATE TABLE plans (
planned_at TIMESTAMPTZ,
node_id TEXT PRIMARY KEY,
parent_id TEXT REFERENCES plans(node_id),
node_type TEXT NOT NULL,
total_runtime INTERVAL,
strategy TEXT,
operation TEXT,
startup_cost FLOAT,
total_cost FLOAT,
plan_rows FLOAT,
plan_width INTEGER,
actual_startup_time INTERVAL,
actual_total_time INTERVAL,
actual_rows FLOAT,
actual_loops FLOAT,
parent_relationship TEXT,
sort_key TEXT[],
sort_method TEXT[],
sort_space_used BIGINT,
sort_space_type TEXT,
join_type TEXT,
join_filter TEXT,
hash_cond TEXT,
relation_name TEXT,
alias TEXT,
scan_direction TEXT,
index_name TEXT,
index_cond TEXT,
recheck_cond TEXT,
tid_cond TEXT,
merge_cond TEXT,
subplan_name TEXT,
function_name TEXT,
function_call TEXT,
filter TEXT,
one_time_filter TEXT,
command TEXT,
shared_hit_blocks BIGINT,
shared_read_blocks BIGINT,
shared_written_blocks BIGINT,
local_hit_blocks BIGINT,
local_read_blocks BIGINT,
local_written_blocks BIGINT,
temp_read_blocks BIGINT,
temp_written_blocks BIGINT,
output TEXT[],
hash_buckets BIGINT,
hash_batches BIGINT,
original_hash_batches BIGINT,
peak_memory_usage BIGINT,
schema TEXT,
cte_name TEXT,
triggers trigger_plan[]
);

planned_at is just the current time (from NOW()).

node_id is simply `md5( pg_backend_pid() || clock_timestamp() )`, which is run just before each node is parsed.

trigger_plan is a composite type:

CREATE TYPE trigger_plan AS (
trigger_name TEXT,
constraint_name TEXT,
relation TEXT,
time INTERVAL,
calls FLOAT
);

I'm wondering if there's any reason why we couldn't have EXPLAIN do something like this itself in core:

EXPLAIN (format table) SELECT * FROM bar;

It could output a table like the above. FWIW, The function I've written works like this:

SELECT plan('SELECT * FROM bar');

Which is an okay workaround. Anyone else think that this might be useful?

Best,

David

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message David E. Wheeler 2010-11-08 23:15:13 Re: Query Plan Columns
Previous Message Alvaro Herrera 2010-11-08 23:03:13 Re: W3C Specs: Web SQL