mirror of https://github.com/citusdata/citus.git
Merge pull request #3878 from citusdata/explain_analyze_initial_cleanup
Explain Analyze tests & cleanuppull/3882/head
commit
6869d7bfb2
|
@ -57,13 +57,6 @@
|
||||||
#include "utils/snapmgr.h"
|
#include "utils/snapmgr.h"
|
||||||
|
|
||||||
|
|
||||||
/* OR-able flags for ExplainXMLTag() (explain.c) */
|
|
||||||
#define X_OPENING 0
|
|
||||||
#define X_CLOSING 1
|
|
||||||
#define X_CLOSE_IMMEDIATE 2
|
|
||||||
#define X_NOWHITESPACE 4
|
|
||||||
|
|
||||||
|
|
||||||
/* Config variables that enable printing distributed query plans */
|
/* Config variables that enable printing distributed query plans */
|
||||||
bool ExplainDistributedQueries = true;
|
bool ExplainDistributedQueries = true;
|
||||||
bool ExplainAllTasks = false;
|
bool ExplainAllTasks = false;
|
||||||
|
@ -148,21 +141,23 @@ CoordinatorInsertSelectExplainScan(CustomScanState *node, List *ancestors,
|
||||||
char *queryString = NULL;
|
char *queryString = NULL;
|
||||||
int cursorOptions = CURSOR_OPT_PARALLEL_OK;
|
int cursorOptions = CURSOR_OPT_PARALLEL_OK;
|
||||||
|
|
||||||
if (es->analyze)
|
|
||||||
{
|
|
||||||
/* avoiding double execution here is tricky, error out for now */
|
|
||||||
ereport(ERROR, (errmsg("EXPLAIN ANALYZE is currently not supported for INSERT "
|
|
||||||
"... SELECT commands via the coordinator")));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make a copy of the query, since pg_plan_query may scribble on it and later
|
* Make a copy of the query, since pg_plan_query may scribble on it and later
|
||||||
* stages of EXPLAIN require it.
|
* stages of EXPLAIN require it.
|
||||||
*/
|
*/
|
||||||
Query *queryCopy = copyObject(query);
|
Query *queryCopy = copyObject(query);
|
||||||
PlannedStmt *selectPlan = pg_plan_query(queryCopy, cursorOptions, params);
|
PlannedStmt *selectPlan = pg_plan_query(queryCopy, cursorOptions, params);
|
||||||
if (IsRedistributablePlan(selectPlan->planTree) &&
|
bool repartition = IsRedistributablePlan(selectPlan->planTree) &&
|
||||||
IsSupportedRedistributionTarget(targetRelationId))
|
IsSupportedRedistributionTarget(targetRelationId);
|
||||||
|
|
||||||
|
if (es->analyze)
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errmsg("EXPLAIN ANALYZE is currently not supported for INSERT "
|
||||||
|
"... SELECT commands %s",
|
||||||
|
repartition ? "with repartitioning" : "via coordinator")));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (repartition)
|
||||||
{
|
{
|
||||||
ExplainPropertyText("INSERT/SELECT method", "repartition", es);
|
ExplainPropertyText("INSERT/SELECT method", "repartition", es);
|
||||||
}
|
}
|
||||||
|
|
|
@ -573,6 +573,11 @@ EXPLAIN INSERT INTO target_table SELECT a, max(b) FROM source_table GROUP BY a;
|
||||||
-> Seq Scan on source_table_4213606 source_table (cost=0.00..32.60 rows=2260 width=8)
|
-> Seq Scan on source_table_4213606 source_table (cost=0.00..32.60 rows=2260 width=8)
|
||||||
(10 rows)
|
(10 rows)
|
||||||
|
|
||||||
|
--
|
||||||
|
-- EXPLAIN ANALYZE is currently not supported
|
||||||
|
--
|
||||||
|
EXPLAIN ANALYZE INSERT INTO target_table SELECT a, max(b) FROM source_table GROUP BY a;
|
||||||
|
ERROR: EXPLAIN ANALYZE is currently not supported for INSERT ... SELECT commands with repartitioning
|
||||||
--
|
--
|
||||||
-- Duplicate names in target list
|
-- Duplicate names in target list
|
||||||
--
|
--
|
||||||
|
|
|
@ -289,6 +289,27 @@ Sort (actual rows=50 loops=1)
|
||||||
-> HashAggregate (actual rows=50 loops=1)
|
-> HashAggregate (actual rows=50 loops=1)
|
||||||
Group Key: l_quantity
|
Group Key: l_quantity
|
||||||
-> Seq Scan on lineitem_290000 lineitem (actual rows=6000 loops=1)
|
-> Seq Scan on lineitem_290000 lineitem (actual rows=6000 loops=1)
|
||||||
|
-- EXPLAIN ANALYZE doesn't show worker tasks for repartition joins yet
|
||||||
|
SET citus.shard_count TO 3;
|
||||||
|
CREATE TABLE t1(a int, b int);
|
||||||
|
CREATE TABLE t2(a int, b int);
|
||||||
|
SELECT create_distributed_table('t1', 'a'), create_distributed_table('t2', 'a');
|
||||||
|
|
|
||||||
|
BEGIN;
|
||||||
|
SET LOCAL citus.enable_repartition_joins TO true;
|
||||||
|
EXPLAIN (COSTS off, ANALYZE on, TIMING off, SUMMARY off) SELECT count(*) FROM t1, t2 WHERE t1.a=t2.b;
|
||||||
|
Aggregate (actual rows=1 loops=1)
|
||||||
|
-> Custom Scan (Citus Adaptive) (actual rows=4 loops=1)
|
||||||
|
Task Count: 4
|
||||||
|
Tasks Shown: None, not supported for re-partition queries
|
||||||
|
-> MapMergeJob
|
||||||
|
Map Task Count: 3
|
||||||
|
Merge Task Count: 4
|
||||||
|
-> MapMergeJob
|
||||||
|
Map Task Count: 3
|
||||||
|
Merge Task Count: 4
|
||||||
|
END;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
-- Test verbose
|
-- Test verbose
|
||||||
EXPLAIN (COSTS FALSE, VERBOSE TRUE)
|
EXPLAIN (COSTS FALSE, VERBOSE TRUE)
|
||||||
SELECT sum(l_quantity) / avg(l_quantity) FROM lineitem;
|
SELECT sum(l_quantity) / avg(l_quantity) FROM lineitem;
|
||||||
|
|
|
@ -910,6 +910,14 @@ $Q$);
|
||||||
Task Count: 4
|
Task Count: 4
|
||||||
(4 rows)
|
(4 rows)
|
||||||
|
|
||||||
|
-- EXPLAIN ANALYZE is not supported for INSERT ... SELECT via coordinator
|
||||||
|
EXPLAIN (costs off, analyze on)
|
||||||
|
INSERT INTO agg_events (user_id)
|
||||||
|
SELECT
|
||||||
|
raw_events_first.user_id
|
||||||
|
FROM
|
||||||
|
raw_events_first INNER JOIN raw_events_second ON raw_events_first.value_1 = raw_events_second.value_1;
|
||||||
|
ERROR: EXPLAIN ANALYZE is currently not supported for INSERT ... SELECT commands via coordinator
|
||||||
-- even if there is a filter on the partition key, since the join is not on the partition key we reject
|
-- even if there is a filter on the partition key, since the join is not on the partition key we reject
|
||||||
-- this query
|
-- this query
|
||||||
INSERT INTO agg_events (user_id)
|
INSERT INTO agg_events (user_id)
|
||||||
|
|
|
@ -271,6 +271,12 @@ SELECT * FROM target_table ORDER BY a;
|
||||||
|
|
||||||
EXPLAIN INSERT INTO target_table SELECT a, max(b) FROM source_table GROUP BY a;
|
EXPLAIN INSERT INTO target_table SELECT a, max(b) FROM source_table GROUP BY a;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- EXPLAIN ANALYZE is currently not supported
|
||||||
|
--
|
||||||
|
|
||||||
|
EXPLAIN ANALYZE INSERT INTO target_table SELECT a, max(b) FROM source_table GROUP BY a;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Duplicate names in target list
|
-- Duplicate names in target list
|
||||||
--
|
--
|
||||||
|
|
|
@ -85,6 +85,17 @@ EXPLAIN (COSTS FALSE, ANALYZE TRUE, TIMING FALSE, SUMMARY FALSE)
|
||||||
SELECT l_quantity, count(*) count_quantity FROM lineitem
|
SELECT l_quantity, count(*) count_quantity FROM lineitem
|
||||||
GROUP BY l_quantity ORDER BY count_quantity, l_quantity;
|
GROUP BY l_quantity ORDER BY count_quantity, l_quantity;
|
||||||
|
|
||||||
|
-- EXPLAIN ANALYZE doesn't show worker tasks for repartition joins yet
|
||||||
|
SET citus.shard_count TO 3;
|
||||||
|
CREATE TABLE t1(a int, b int);
|
||||||
|
CREATE TABLE t2(a int, b int);
|
||||||
|
SELECT create_distributed_table('t1', 'a'), create_distributed_table('t2', 'a');
|
||||||
|
BEGIN;
|
||||||
|
SET LOCAL citus.enable_repartition_joins TO true;
|
||||||
|
EXPLAIN (COSTS off, ANALYZE on, TIMING off, SUMMARY off) SELECT count(*) FROM t1, t2 WHERE t1.a=t2.b;
|
||||||
|
END;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
-- Test verbose
|
-- Test verbose
|
||||||
EXPLAIN (COSTS FALSE, VERBOSE TRUE)
|
EXPLAIN (COSTS FALSE, VERBOSE TRUE)
|
||||||
SELECT sum(l_quantity) / avg(l_quantity) FROM lineitem;
|
SELECT sum(l_quantity) / avg(l_quantity) FROM lineitem;
|
||||||
|
|
|
@ -677,6 +677,14 @@ SET client_min_messages TO WARNING;
|
||||||
raw_events_first INNER JOIN raw_events_second ON raw_events_first.value_1 = raw_events_second.value_1;
|
raw_events_first INNER JOIN raw_events_second ON raw_events_first.value_1 = raw_events_second.value_1;
|
||||||
$Q$);
|
$Q$);
|
||||||
|
|
||||||
|
-- EXPLAIN ANALYZE is not supported for INSERT ... SELECT via coordinator
|
||||||
|
EXPLAIN (costs off, analyze on)
|
||||||
|
INSERT INTO agg_events (user_id)
|
||||||
|
SELECT
|
||||||
|
raw_events_first.user_id
|
||||||
|
FROM
|
||||||
|
raw_events_first INNER JOIN raw_events_second ON raw_events_first.value_1 = raw_events_second.value_1;
|
||||||
|
|
||||||
-- even if there is a filter on the partition key, since the join is not on the partition key we reject
|
-- even if there is a filter on the partition key, since the join is not on the partition key we reject
|
||||||
-- this query
|
-- this query
|
||||||
INSERT INTO agg_events (user_id)
|
INSERT INTO agg_events (user_id)
|
||||||
|
|
Loading…
Reference in New Issue