PG-188: Added a new column to monitor the query state.
parent
73fbc7f017
commit
f8ed33a92a
2
Makefile
2
Makefile
|
@ -11,7 +11,7 @@ PGFILEDESC = "pg_stat_monitor - execution statistics of SQL statements"
|
||||||
LDFLAGS_SL += $(filter -lm, $(LIBS))
|
LDFLAGS_SL += $(filter -lm, $(LIBS))
|
||||||
|
|
||||||
REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_monitor/pg_stat_monitor.conf --inputdir=regression
|
REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_monitor/pg_stat_monitor.conf --inputdir=regression
|
||||||
REGRESS = basic version guc counters relations database top_query application_name cmd_type error rows
|
REGRESS = basic version guc counters relations database top_query application_name cmd_type error state rows
|
||||||
|
|
||||||
# Disabled because these tests require "shared_preload_libraries=pg_stat_statements",
|
# Disabled because these tests require "shared_preload_libraries=pg_stat_statements",
|
||||||
# which typical installcheck users do not have (e.g. buildfarm clients).
|
# which typical installcheck users do not have (e.g. buildfarm clients).
|
||||||
|
|
|
@ -34,7 +34,7 @@ CREATE FUNCTION pg_stat_monitor_internal(IN showtext boolean,
|
||||||
OUT planid text,
|
OUT planid text,
|
||||||
OUT query text,
|
OUT query text,
|
||||||
OUT query_plan text,
|
OUT query_plan text,
|
||||||
OUT state int8,
|
OUT state_code int8,
|
||||||
OUT top_queryid text,
|
OUT top_queryid text,
|
||||||
OUT application_name text,
|
OUT application_name text,
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ CREATE FUNCTION pg_stat_monitor_internal(IN showtext boolean,
|
||||||
OUT max_time float8,
|
OUT max_time float8,
|
||||||
OUT mean_time float8,
|
OUT mean_time float8,
|
||||||
OUT stddev_time float8,
|
OUT stddev_time float8,
|
||||||
OUT rows int8,
|
OUT rows_retrieved int8,
|
||||||
|
|
||||||
OUT plans_calls int8, -- 23
|
OUT plans_calls int8, -- 23
|
||||||
OUT plan_total_time float8,
|
OUT plan_total_time float8,
|
||||||
|
@ -83,15 +83,15 @@ RETURNS SETOF record
|
||||||
AS 'MODULE_PATHNAME', 'pg_stat_monitor'
|
AS 'MODULE_PATHNAME', 'pg_stat_monitor'
|
||||||
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
|
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION get_state(state int8) RETURNS TEXT AS
|
CREATE OR REPLACE FUNCTION get_state(state_code int8) RETURNS TEXT AS
|
||||||
$$
|
$$
|
||||||
SELECT
|
SELECT
|
||||||
CASE
|
CASE
|
||||||
WHEN state = 0 THEN 'PARSED'
|
WHEN state_code = 0 THEN 'PARSING'
|
||||||
WHEN state = 1 THEN 'PLANNING'
|
WHEN state_code = 1 THEN 'PLANNING'
|
||||||
WHEN state = 2 THEN 'EXECUTION FINISHED'
|
WHEN state_code = 2 THEN 'ACTIVE'
|
||||||
WHEN state = 3 THEN 'ERROR'
|
WHEN state_code = 3 THEN 'FINISHED'
|
||||||
WHEN state = 4 THEN 'FINISHED'
|
WHEN state_code = 4 THEN 'FINISHED WITH ERROR'
|
||||||
END
|
END
|
||||||
$$
|
$$
|
||||||
LANGUAGE SQL PARALLEL SAFE;
|
LANGUAGE SQL PARALLEL SAFE;
|
||||||
|
@ -160,7 +160,7 @@ CREATE VIEW pg_stat_monitor AS SELECT
|
||||||
round( CAST(max_time as numeric), 4)::float8 as max_time,
|
round( CAST(max_time as numeric), 4)::float8 as max_time,
|
||||||
round( CAST(mean_time as numeric), 4)::float8 as mean_time,
|
round( CAST(mean_time as numeric), 4)::float8 as mean_time,
|
||||||
round( CAST(stddev_time as numeric), 4)::float8 as stddev_time,
|
round( CAST(stddev_time as numeric), 4)::float8 as stddev_time,
|
||||||
rows,
|
rows_retrieved,
|
||||||
plans_calls,
|
plans_calls,
|
||||||
round( CAST(plan_total_time as numeric), 4)::float8 as plan_total_time,
|
round( CAST(plan_total_time as numeric), 4)::float8 as plan_total_time,
|
||||||
round( CAST(plan_min_time as numeric), 4)::float8 as plan_min_time,
|
round( CAST(plan_min_time as numeric), 4)::float8 as plan_min_time,
|
||||||
|
@ -185,8 +185,8 @@ CREATE VIEW pg_stat_monitor AS SELECT
|
||||||
wal_records,
|
wal_records,
|
||||||
wal_fpi,
|
wal_fpi,
|
||||||
wal_bytes,
|
wal_bytes,
|
||||||
state,
|
state_code,
|
||||||
get_state(state) as state_value
|
get_state(state_code) as state
|
||||||
FROM pg_stat_monitor_internal(TRUE) p, pg_database d WHERE dbid = oid
|
FROM pg_stat_monitor_internal(TRUE) p, pg_database d WHERE dbid = oid
|
||||||
ORDER BY bucket_start_time;
|
ORDER BY bucket_start_time;
|
||||||
|
|
||||||
|
|
|
@ -366,6 +366,8 @@ pgss_post_parse_analyze(ParseState *pstate, Query *query)
|
||||||
static void
|
static void
|
||||||
pgss_ExecutorStart(QueryDesc *queryDesc, int eflags)
|
pgss_ExecutorStart(QueryDesc *queryDesc, int eflags)
|
||||||
{
|
{
|
||||||
|
uint64 queryId = queryDesc->plannedstmt->queryId;
|
||||||
|
|
||||||
if(getrusage(RUSAGE_SELF, &rusage_start) != 0)
|
if(getrusage(RUSAGE_SELF, &rusage_start) != 0)
|
||||||
elog(DEBUG1, "pg_stat_monitor: failed to execute getrusage");
|
elog(DEBUG1, "pg_stat_monitor: failed to execute getrusage");
|
||||||
|
|
||||||
|
@ -394,6 +396,22 @@ pgss_ExecutorStart(QueryDesc *queryDesc, int eflags)
|
||||||
queryDesc->totaltime = InstrAlloc(1, INSTRUMENT_ALL);
|
queryDesc->totaltime = InstrAlloc(1, INSTRUMENT_ALL);
|
||||||
MemoryContextSwitchTo(oldcxt);
|
MemoryContextSwitchTo(oldcxt);
|
||||||
}
|
}
|
||||||
|
pgss_store(queryId, /* query id */
|
||||||
|
queryDesc->sourceText, /* query text */
|
||||||
|
NULL, /* PlanInfo */
|
||||||
|
queryDesc->operation, /* CmdType */
|
||||||
|
NULL, /* SysInfo */
|
||||||
|
NULL, /* ErrorInfo */
|
||||||
|
0, /* totaltime */
|
||||||
|
0, /* rows */
|
||||||
|
NULL, /* bufusage */
|
||||||
|
#if PG_VERSION_NUM >= 130000
|
||||||
|
NULL, /* walusage */
|
||||||
|
#else
|
||||||
|
NULL,
|
||||||
|
#endif
|
||||||
|
NULL,
|
||||||
|
PGSS_EXEC); /* pgssStoreKind */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,7 +537,7 @@ pgss_ExecutorEnd(QueryDesc *queryDesc)
|
||||||
NULL,
|
NULL,
|
||||||
#endif
|
#endif
|
||||||
NULL,
|
NULL,
|
||||||
PGSS_EXEC); /* pgssStoreKind */
|
PGSS_FINISHED); /* pgssStoreKind */
|
||||||
}
|
}
|
||||||
if (prev_ExecutorEnd)
|
if (prev_ExecutorEnd)
|
||||||
prev_ExecutorEnd(queryDesc);
|
prev_ExecutorEnd(queryDesc);
|
||||||
|
@ -906,6 +924,7 @@ pgss_update_entry(pgssEntry *entry,
|
||||||
if (reset)
|
if (reset)
|
||||||
memset(&entry->counters, 0, sizeof(Counters));
|
memset(&entry->counters, 0, sizeof(Counters));
|
||||||
|
|
||||||
|
e->counters.state = kind;
|
||||||
if (kind == PGSS_PLAN)
|
if (kind == PGSS_PLAN)
|
||||||
{
|
{
|
||||||
if (e->counters.plancalls.calls == 0)
|
if (e->counters.plancalls.calls == 0)
|
||||||
|
@ -929,9 +948,8 @@ pgss_update_entry(pgssEntry *entry,
|
||||||
if (e->counters.plantime.min_time > total_time) e->counters.plantime.min_time = total_time;
|
if (e->counters.plantime.min_time > total_time) e->counters.plantime.min_time = total_time;
|
||||||
if (e->counters.plantime.max_time < total_time) e->counters.plantime.max_time = total_time;
|
if (e->counters.plantime.max_time < total_time) e->counters.plantime.max_time = total_time;
|
||||||
}
|
}
|
||||||
else
|
else if (kind == PGSS_FINISHED)
|
||||||
{
|
{
|
||||||
e->counters.state = kind;
|
|
||||||
if (e->counters.calls.calls == 0)
|
if (e->counters.calls.calls == 0)
|
||||||
e->counters.calls.usage = USAGE_INIT;
|
e->counters.calls.usage = USAGE_INIT;
|
||||||
e->counters.calls.calls += 1;
|
e->counters.calls.calls += 1;
|
||||||
|
@ -1130,7 +1148,7 @@ pgss_store_error(uint64 queryid,
|
||||||
NULL, /* bufusage */
|
NULL, /* bufusage */
|
||||||
NULL, /* walusage */
|
NULL, /* walusage */
|
||||||
NULL, /* pgssJumbleState */
|
NULL, /* pgssJumbleState */
|
||||||
PGSS_EXEC); /* pgssStoreKind */
|
PGSS_ERROR); /* pgssStoreKind */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1153,7 +1171,7 @@ pgss_store_utility(const char *query,
|
||||||
bufusage, /* bufusage */
|
bufusage, /* bufusage */
|
||||||
walusage, /* walusage */
|
walusage, /* walusage */
|
||||||
NULL, /* pgssJumbleState */
|
NULL, /* pgssJumbleState */
|
||||||
PGSS_EXEC); /* pgssStoreKind */
|
PGSS_FINISHED); /* pgssStoreKind */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1219,7 +1237,9 @@ pgss_store(uint64 queryid,
|
||||||
elog(DEBUG1, "pg_stat_monitor: out of memory");
|
elog(DEBUG1, "pg_stat_monitor: out of memory");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PGSS_ERROR:
|
||||||
case PGSS_EXEC:
|
case PGSS_EXEC:
|
||||||
|
case PGSS_FINISHED:
|
||||||
{
|
{
|
||||||
pgssQueryEntry *query_entry;
|
pgssQueryEntry *query_entry;
|
||||||
query_entry = pgss_store_query_info(bucketid, queryid, dbid, userid, ip, query, strlen(query), kind);
|
query_entry = pgss_store_query_info(bucketid, queryid, dbid, userid, ip, query, strlen(query), kind);
|
||||||
|
@ -1252,13 +1272,9 @@ pgss_store(uint64 queryid,
|
||||||
kind); /* kind */
|
kind); /* kind */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PGSS_FINISHED:
|
|
||||||
case PGSS_NUMKIND:
|
case PGSS_NUMKIND:
|
||||||
case PGSS_INVALID:
|
case PGSS_INVALID:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PGSS_ERROR:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
LWLockRelease(pgss->lock);
|
LWLockRelease(pgss->lock);
|
||||||
}
|
}
|
||||||
|
@ -1319,6 +1335,7 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
MemoryContext oldcontext;
|
MemoryContext oldcontext;
|
||||||
HASH_SEQ_STATUS hash_seq;
|
HASH_SEQ_STATUS hash_seq;
|
||||||
pgssEntry *entry;
|
pgssEntry *entry;
|
||||||
|
pgssQueryEntry *query_entry;
|
||||||
char parentid_txt[64];
|
char parentid_txt[64];
|
||||||
pgssSharedState *pgss = pgsm_get_ss();
|
pgssSharedState *pgss = pgsm_get_ss();
|
||||||
HTAB *pgss_hash = pgsm_get_hash();
|
HTAB *pgss_hash = pgsm_get_hash();
|
||||||
|
@ -1377,7 +1394,6 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
uint64 userid = entry->key.userid;
|
uint64 userid = entry->key.userid;
|
||||||
uint64 ip = entry->key.ip;
|
uint64 ip = entry->key.ip;
|
||||||
uint64 planid = entry->key.planid;
|
uint64 planid = entry->key.planid;
|
||||||
|
|
||||||
unsigned char *buf = pgss_qbuf[bucketid];
|
unsigned char *buf = pgss_qbuf[bucketid];
|
||||||
char *query_txt = (char*) malloc(PGSM_QUERY_MAX_LEN);
|
char *query_txt = (char*) malloc(PGSM_QUERY_MAX_LEN);
|
||||||
bool is_allowed_role = is_member_of_role(GetUserId(), DEFAULT_ROLE_READ_ALL_STATS);
|
bool is_allowed_role = is_member_of_role(GetUserId(), DEFAULT_ROLE_READ_ALL_STATS);
|
||||||
|
@ -1385,7 +1401,8 @@ pg_stat_monitor_internal(FunctionCallInfo fcinfo,
|
||||||
if (!IsBucketValid(bucketid))
|
if (!IsBucketValid(bucketid))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!hash_find_query_entry(bucketid, queryid, dbid, userid, ip))
|
query_entry = hash_find_query_entry(bucketid, queryid, dbid, userid, ip);
|
||||||
|
if (query_entry == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (read_query(buf, bucketid, queryid, query_txt) == 0)
|
if (read_query(buf, bucketid, queryid, query_txt) == 0)
|
||||||
|
@ -2706,7 +2723,6 @@ pgss_store_query_info(uint64 bucketid,
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
entry->state = kind;
|
|
||||||
memcpy(&buf_len, buf, sizeof (uint64));
|
memcpy(&buf_len, buf, sizeof (uint64));
|
||||||
if (buf_len == 0)
|
if (buf_len == 0)
|
||||||
buf_len += sizeof (uint64);
|
buf_len += sizeof (uint64);
|
||||||
|
@ -2830,7 +2846,7 @@ set_qbuf(int i, unsigned char *buf)
|
||||||
void
|
void
|
||||||
pgsm_emit_log_hook(ErrorData *edata)
|
pgsm_emit_log_hook(ErrorData *edata)
|
||||||
{
|
{
|
||||||
if (!IsSystemInitialized())
|
if (!IsSystemInitialized() || edata == NULL)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
if ((edata->elevel == ERROR || edata->elevel == WARNING || edata->elevel == INFO || edata->elevel == DEBUG1))
|
if ((edata->elevel == ERROR || edata->elevel == WARNING || edata->elevel == INFO || edata->elevel == DEBUG1))
|
||||||
|
|
|
@ -139,8 +139,8 @@ typedef enum pgssStoreKind
|
||||||
PGSS_PARSE = 0,
|
PGSS_PARSE = 0,
|
||||||
PGSS_PLAN,
|
PGSS_PLAN,
|
||||||
PGSS_EXEC,
|
PGSS_EXEC,
|
||||||
PGSS_ERROR,
|
|
||||||
PGSS_FINISHED,
|
PGSS_FINISHED,
|
||||||
|
PGSS_ERROR,
|
||||||
|
|
||||||
PGSS_NUMKIND /* Must be last value of this enum */
|
PGSS_NUMKIND /* Must be last value of this enum */
|
||||||
} pgssStoreKind;
|
} pgssStoreKind;
|
||||||
|
@ -181,9 +181,8 @@ typedef struct pgssQueryHashKey
|
||||||
|
|
||||||
typedef struct pgssQueryEntry
|
typedef struct pgssQueryEntry
|
||||||
{
|
{
|
||||||
pgssQueryHashKey key; /* hash key of entry - MUST BE FIRST */
|
pgssQueryHashKey key; /* hash key of entry - MUST BE FIRST */
|
||||||
uint64 pos; /* bucket number */
|
uint64 pos; /* bucket number */
|
||||||
uint64 state; /* query state */
|
|
||||||
} pgssQueryEntry;
|
} pgssQueryEntry;
|
||||||
|
|
||||||
typedef struct PlanInfo
|
typedef struct PlanInfo
|
||||||
|
|
|
@ -12,11 +12,12 @@ SELECT 1 AS num;
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT query,application_name FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query,application_name FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
query | application_name
|
query | application_name
|
||||||
---------------------------------+-----------------------------
|
--------------------------------------------------------------------------------+-----------------------------
|
||||||
SELECT $1 AS num | pg_regress/application_name
|
SELECT $1 AS num | pg_regress/application_name
|
||||||
SELECT pg_stat_monitor_reset(); | pg_regress/application_name
|
SELECT pg_stat_monitor_reset(); | pg_regress/application_name
|
||||||
(2 rows)
|
SELECT query,application_name FROM pg_stat_monitor ORDER BY query COLLATE "C"; | pg_regress/application_name
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -12,11 +12,12 @@ SELECT 1 AS num;
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
query
|
query
|
||||||
---------------------------------
|
---------------------------------------------------------------
|
||||||
SELECT $1 AS num
|
SELECT $1 AS num
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
(2 rows)
|
SELECT query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -24,19 +24,20 @@ SELECT b FROM t2 FOR UPDATE;
|
||||||
TRUNCATE t1;
|
TRUNCATE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SELECT query, cmd_type, cmd_type_text FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query, cmd_type, cmd_type_text FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
query | cmd_type | cmd_type_text
|
query | cmd_type | cmd_type_text
|
||||||
---------------------------------+----------+---------------
|
-----------------------------------------------------------------------------------------+----------+---------------
|
||||||
CREATE TABLE t1 (a INTEGER); | 0 |
|
CREATE TABLE t1 (a INTEGER); | 0 |
|
||||||
CREATE TABLE t2 (b INTEGER); | 0 |
|
CREATE TABLE t2 (b INTEGER); | 0 |
|
||||||
DELETE FROM t1; | 4 | DELETE
|
DELETE FROM t1; | 4 | DELETE
|
||||||
DROP TABLE t1; | 0 |
|
DROP TABLE t1; | 0 |
|
||||||
INSERT INTO t1 VALUES($1) | 3 | INSERT
|
INSERT INTO t1 VALUES($1) | 3 | INSERT
|
||||||
SELECT a FROM t1; | 1 | SELECT
|
SELECT a FROM t1; | 1 | SELECT
|
||||||
SELECT b FROM t2 FOR UPDATE; | 1 | SELECT
|
SELECT b FROM t2 FOR UPDATE; | 1 | SELECT
|
||||||
SELECT pg_stat_monitor_reset(); | 1 | SELECT
|
SELECT pg_stat_monitor_reset(); | 1 | SELECT
|
||||||
TRUNCATE t1; | 0 |
|
SELECT query, cmd_type, cmd_type_text FROM pg_stat_monitor ORDER BY query COLLATE "C"; | 1 | SELECT
|
||||||
UPDATE t1 SET a = $1 | 2 | UPDATE
|
TRUNCATE t1; | 0 |
|
||||||
(10 rows)
|
UPDATE t1 SET a = $1 | 2 | UPDATE
|
||||||
|
(11 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -40,7 +40,8 @@ SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
----------------------------------------------------------------------------------+-------
|
----------------------------------------------------------------------------------+-------
|
||||||
SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; | 4
|
SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; | 4
|
||||||
SELECT pg_stat_monitor_reset(); | 1
|
SELECT pg_stat_monitor_reset(); | 1
|
||||||
(2 rows)
|
SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; | 1
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
@ -69,6 +70,7 @@ SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
---------------------------------------------------------------------------------------------------+-------
|
---------------------------------------------------------------------------------------------------+-------
|
||||||
SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; | 1000
|
SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; | 1000
|
||||||
SELECT pg_stat_monitor_reset(); | 1
|
SELECT pg_stat_monitor_reset(); | 1
|
||||||
|
SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; | 1
|
||||||
do $$ +| 1
|
do $$ +| 1
|
||||||
declare +|
|
declare +|
|
||||||
n integer:= 1; +|
|
n integer:= 1; +|
|
||||||
|
@ -79,7 +81,7 @@ SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
n := n + 1; +|
|
n := n + 1; +|
|
||||||
end loop; +|
|
end loop; +|
|
||||||
end $$; |
|
end $$; |
|
||||||
(3 rows)
|
(4 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -28,12 +28,13 @@ SELECT * FROM t3,t4 WHERE t3.c = t4.d;
|
||||||
|
|
||||||
\c contrib_regression
|
\c contrib_regression
|
||||||
SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
datname | query
|
datname | query
|
||||||
--------------------+----------------------------------------
|
--------------------+------------------------------------------------------------------------
|
||||||
db1 | SELECT * FROM t1,t2 WHERE t1.a = t2.b;
|
db1 | SELECT * FROM t1,t2 WHERE t1.a = t2.b;
|
||||||
db2 | SELECT * FROM t3,t4 WHERE t3.c = t4.d;
|
db2 | SELECT * FROM t3,t4 WHERE t3.c = t4.d;
|
||||||
|
contrib_regression | SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
contrib_regression | SELECT pg_stat_monitor_reset();
|
contrib_regression | SELECT pg_stat_monitor_reset();
|
||||||
(3 rows)
|
(4 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -20,18 +20,19 @@ BEGIN
|
||||||
RAISE WARNING 'warning message';
|
RAISE WARNING 'warning message';
|
||||||
END $$;
|
END $$;
|
||||||
WARNING: warning message
|
WARNING: warning message
|
||||||
SELECT query, elevel,sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
query | elevel | sqlcode | message
|
query | elevel | sqlcode | message
|
||||||
----------------------------------+--------+---------+-----------------------------------
|
-----------------------------------------------------------------------------------------+--------+---------+-----------------------------------
|
||||||
ELECET * FROM unknown; | 20 | 42601 | syntax error at or near "ELECET"
|
ELECET * FROM unknown; | 20 | 42601 | syntax error at or near "ELECET"
|
||||||
SELECT * FROM unknown; | 20 | 42P01 | relation "unknown" does not exist
|
SELECT * FROM unknown; | 20 | 42P01 | relation "unknown" does not exist
|
||||||
SELECT 1/0; | 20 | 22012 | division by zero
|
SELECT 1/0; | 20 | 22012 | division by zero
|
||||||
SELECT pg_stat_monitor_reset(); | 0 | |
|
SELECT pg_stat_monitor_reset(); | 0 | |
|
||||||
do $$ +| 19 | 01000 | warning message
|
SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C"; | 0 | |
|
||||||
BEGIN +| | |
|
do $$ +| 19 | 01000 | warning message
|
||||||
RAISE WARNING 'warning message';+| | |
|
BEGIN +| | |
|
||||||
END $$; | | |
|
RAISE WARNING 'warning message'; +| | |
|
||||||
(5 rows)
|
END $$; | | |
|
||||||
|
(6 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -37,14 +37,15 @@ SELECT * FROM foo1, foo2, foo3, foo4;
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
||||||
query | relations
|
query | relations
|
||||||
---------------------------------------+---------------------------------------------------
|
--------------------------------------------------------------+---------------------------------------------------
|
||||||
SELECT * FROM foo1, foo2, foo3, foo4; | {public.foo1,public.foo2,public.foo3,public.foo4}
|
SELECT * FROM foo1, foo2, foo3, foo4; | {public.foo1,public.foo2,public.foo3,public.foo4}
|
||||||
SELECT * FROM foo1, foo2, foo3; | {public.foo1,public.foo2,public.foo3}
|
SELECT * FROM foo1, foo2, foo3; | {public.foo1,public.foo2,public.foo3}
|
||||||
SELECT * FROM foo1, foo2; | {public.foo1,public.foo2}
|
SELECT * FROM foo1, foo2; | {public.foo1,public.foo2}
|
||||||
SELECT * FROM foo1; | {public.foo1}
|
SELECT * FROM foo1; | {public.foo1}
|
||||||
SELECT pg_stat_monitor_reset(); |
|
SELECT pg_stat_monitor_reset(); |
|
||||||
(5 rows)
|
SELECT query, relations from pg_stat_monitor ORDER BY query; | {public.pg_stat_monitor*,pg_catalog.pg_database}
|
||||||
|
(6 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
@ -88,14 +89,15 @@ SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3, sch4.foo4;
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
||||||
query | relations
|
query | relations
|
||||||
-----------------------------------------------------------+-------------------------------------------
|
--------------------------------------------------------------+--------------------------------------------------
|
||||||
SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3, sch4.foo4; | {sch1.foo1,sch2.foo2,sch3.foo3,sch4.foo4}
|
SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3, sch4.foo4; | {sch1.foo1,sch2.foo2,sch3.foo3,sch4.foo4}
|
||||||
SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3; | {sch1.foo1,sch2.foo2,sch3.foo3}
|
SELECT * FROM sch1.foo1, sch2.foo2, sch3.foo3; | {sch1.foo1,sch2.foo2,sch3.foo3}
|
||||||
SELECT * FROM sch1.foo1, sch2.foo2; | {sch1.foo1,sch2.foo2}
|
SELECT * FROM sch1.foo1, sch2.foo2; | {sch1.foo1,sch2.foo2}
|
||||||
SELECT * FROM sch1.foo1; | {sch1.foo1}
|
SELECT * FROM sch1.foo1; | {sch1.foo1}
|
||||||
SELECT pg_stat_monitor_reset(); |
|
SELECT pg_stat_monitor_reset(); |
|
||||||
(5 rows)
|
SELECT query, relations from pg_stat_monitor ORDER BY query; | {public.pg_stat_monitor*,pg_catalog.pg_database}
|
||||||
|
(6 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
@ -120,12 +122,13 @@ SELECT * FROM sch1.foo1, sch2.foo2, foo1, foo2;
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
||||||
query | relations
|
query | relations
|
||||||
-------------------------------------------------+-----------------------------------------------
|
--------------------------------------------------------------+--------------------------------------------------
|
||||||
SELECT * FROM sch1.foo1, foo1; | {sch1.foo1,public.foo1}
|
SELECT * FROM sch1.foo1, foo1; | {sch1.foo1,public.foo1}
|
||||||
SELECT * FROM sch1.foo1, sch2.foo2, foo1, foo2; | {sch1.foo1,sch2.foo2,public.foo1,public.foo2}
|
SELECT * FROM sch1.foo1, sch2.foo2, foo1, foo2; | {sch1.foo1,sch2.foo2,public.foo1,public.foo2}
|
||||||
SELECT pg_stat_monitor_reset(); |
|
SELECT pg_stat_monitor_reset(); |
|
||||||
(3 rows)
|
SELECT query, relations from pg_stat_monitor ORDER BY query; | {public.pg_stat_monitor*,pg_catalog.pg_database}
|
||||||
|
(4 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
@ -165,14 +168,15 @@ SELECT * FROM v1,v2,v3,v4;
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
SELECT query, relations from pg_stat_monitor ORDER BY query;
|
||||||
query | relations
|
query | relations
|
||||||
---------------------------------+-----------------------------------------------------------------------------------------------
|
--------------------------------------------------------------+-----------------------------------------------------------------------------------------------
|
||||||
SELECT * FROM v1,v2,v3,v4; | {public.v1*,public.foo1,public.v2*,public.foo2,public.v3*,public.foo3,public.v4*,public.foo4}
|
SELECT * FROM v1,v2,v3,v4; | {public.v1*,public.foo1,public.v2*,public.foo2,public.v3*,public.foo3,public.v4*,public.foo4}
|
||||||
SELECT * FROM v1,v2,v3; | {public.v1*,public.foo1,public.v2*,public.foo2,public.v3*,public.foo3}
|
SELECT * FROM v1,v2,v3; | {public.v1*,public.foo1,public.v2*,public.foo2,public.v3*,public.foo3}
|
||||||
SELECT * FROM v1,v2; | {public.v1*,public.foo1,public.v2*,public.foo2}
|
SELECT * FROM v1,v2; | {public.v1*,public.foo1,public.v2*,public.foo2}
|
||||||
SELECT * FROM v1; | {public.v1*,public.foo1}
|
SELECT * FROM v1; | {public.v1*,public.foo1}
|
||||||
SELECT pg_stat_monitor_reset(); |
|
SELECT pg_stat_monitor_reset(); |
|
||||||
(5 rows)
|
SELECT query, relations from pg_stat_monitor ORDER BY query; | {public.pg_stat_monitor*,pg_catalog.pg_database}
|
||||||
|
(6 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -8540,15 +8540,16 @@ SELECt * FROM t2 WHERE b % 2 = 0;
|
||||||
5000
|
5000
|
||||||
(2500 rows)
|
(2500 rows)
|
||||||
|
|
||||||
SELECT query, rows FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query, rows_retrieved FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
query | rows
|
query | rows_retrieved
|
||||||
-------------------------------------+------
|
-------------------------------------------------------------------------------+----------------
|
||||||
SELECT * FROM t1 LIMIT $1 | 10
|
SELECT * FROM t1 LIMIT $1 | 10
|
||||||
SELECT * FROM t1; | 1000
|
SELECT * FROM t1; | 1000
|
||||||
SELECT b FROM t2 FOR UPDATE; | 5000
|
SELECT b FROM t2 FOR UPDATE; | 5000
|
||||||
SELECT pg_stat_monitor_reset(); | 1
|
SELECT pg_stat_monitor_reset(); | 1
|
||||||
SELECt * FROM t2 WHERE b % $1 = $2 | 2500
|
SELECT query, rows_retrieved FROM pg_stat_monitor ORDER BY query COLLATE "C"; | 0
|
||||||
(5 rows)
|
SELECt * FROM t2 WHERE b % $1 = $2 | 2500
|
||||||
|
(6 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -23,23 +23,24 @@ SELECT add2(1,2);
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT query, top_query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query, top_query FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
query | top_query
|
query | top_query
|
||||||
-------------------------------------------------------------+--------------------
|
--------------------------------------------------------------------------+--------------------
|
||||||
CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS+|
|
CREATE OR REPLACE FUNCTION add(int, int) RETURNS INTEGER AS +|
|
||||||
$$ +|
|
$$ +|
|
||||||
BEGIN +|
|
BEGIN +|
|
||||||
return (select $1 + $2); +|
|
return (select $1 + $2); +|
|
||||||
END; $$ language plpgsql; |
|
END; $$ language plpgsql; |
|
||||||
CREATE OR REPLACE function add2(int, int) RETURNS int as +|
|
CREATE OR REPLACE function add2(int, int) RETURNS int as +|
|
||||||
$$ +|
|
$$ +|
|
||||||
BEGIN +|
|
BEGIN +|
|
||||||
return add($1,$2); +|
|
return add($1,$2); +|
|
||||||
END; +|
|
END; +|
|
||||||
$$ language plpgsql; |
|
$$ language plpgsql; |
|
||||||
SELECT (select $1 + $2) | SELECT add2($1,$2)
|
SELECT (select $1 + $2) | SELECT add2($1,$2)
|
||||||
SELECT add2($1,$2) |
|
SELECT add2($1,$2) |
|
||||||
SELECT pg_stat_monitor_reset(); |
|
SELECT pg_stat_monitor_reset(); |
|
||||||
(5 rows)
|
SELECT query, top_query FROM pg_stat_monitor ORDER BY query COLLATE "C"; |
|
||||||
|
(6 rows)
|
||||||
|
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
pg_stat_monitor_reset
|
pg_stat_monitor_reset
|
||||||
|
|
|
@ -9,6 +9,6 @@ BEGIN
|
||||||
RAISE WARNING 'warning message';
|
RAISE WARNING 'warning message';
|
||||||
END $$;
|
END $$;
|
||||||
|
|
||||||
SELECT query, elevel,sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query, elevel, sqlcode, message FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
DROP EXTENSION pg_stat_monitor;
|
DROP EXTENSION pg_stat_monitor;
|
||||||
|
|
|
@ -12,7 +12,7 @@ SELECT * FROM t2;
|
||||||
SELECT * FROM t1 LIMIT 10;
|
SELECT * FROM t1 LIMIT 10;
|
||||||
SELECt * FROM t2 WHERE b % 2 = 0;
|
SELECt * FROM t2 WHERE b % 2 = 0;
|
||||||
|
|
||||||
SELECT query, rows FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
SELECT query, rows_retrieved FROM pg_stat_monitor ORDER BY query COLLATE "C";
|
||||||
SELECT pg_stat_monitor_reset();
|
SELECT pg_stat_monitor_reset();
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
Loading…
Reference in New Issue