Click to copy
Queries • Reviewed for ksqlDB 0.29
How to Get Execution Plan from a Query in ksqlDB
To get the execution plan of a query, use the EXPLAIN command:
EXPLAIN
SELECT
subreddit,
MAX(activeUserCount)
FROM reddit WINDOW TUMBLING (SIZE 1 HOUR)
GROUP BY subreddit
EMIT CHANGES;
You can also pass the ID of a persistent query if you have one:
EXPLAIN query_id;
EXPLAIN is very useful to understand how ksqlDB parses your query. It returns information such as what type of query is it PUSH or PULL, the type of selected fields and expressions, as well as what streams or tables act as sources.
ID : transient_REDDIT_4484078336090288353
Query Type : PUSH
SQL : SELECT
subreddit,
MAX(activeUserCount)
FROM reddit WINDOW TUMBLING (SIZE 1 HOUR)
GROUP BY subreddit
EMIT CHANGES;
Field | Type
-------------------------------------
SUBREDDIT | VARCHAR(STRING) (key)
SUBREDDIT | VARCHAR(STRING)
KSQL_COL_0 | INTEGER
-------------------------------------
Sources that this query reads from:
-----------------------------------
REDDIT
Besides the execution plan, you also get the Kafka Streams topology that ksqlDB runs for the query.
Execution plan
--------------
> [ PROJECT ] | Schema: SUBREDDIT STRING KEY, SUBREDDIT STRING, KSQL_COL_0 INTEGER | Logger: transient_REDDIT_4484078336090288353.Aggregate.Project
> [ AGGREGATE ] | Schema: SUBREDDIT STRING KEY, SUBREDDIT STRING, ACTIVEUSERCOUNT INTEGER, KSQL_AGG_VARIABLE_0 INTEGER, WINDOWSTART BIGINT, WINDOWEND BIGINT | Logger: transient_REDDIT_4484078336090288353.Aggregate.Aggregate
> [ GROUP_BY ] | Schema: SUBREDDIT STRING KEY, SUBREDDIT STRING, ACTIVEUSERCOUNT INTEGER | Logger: transient_REDDIT_4484078336090288353.Aggregate.GroupBy
> [ PROJECT ] | Schema: SUBREDDIT STRING, ACTIVEUSERCOUNT INTEGER | Logger: transient_REDDIT_4484078336090288353.Aggregate.Prepare
> [ SOURCE ] | Schema: SUBREDDIT STRING, ACTIVEUSERCOUNT INTEGER, ROWTIME BIGINT, ROWPARTITION INTEGER, ROWOFFSET BIGINT | Logger: transient_REDDIT_4484078336090288353.KsqlTopic.Source
Processing topology
-------------------
Topologies:
Sub-topology: 0
Source: KSTREAM-SOURCE-0000000000 (topics: [reddit.statistics.json])
--> KSTREAM-TRANSFORMVALUES-0000000001
Processor: KSTREAM-TRANSFORMVALUES-0000000001 (stores: [])
--> Aggregate-Prepare
<-- KSTREAM-SOURCE-0000000000
Processor: Aggregate-Prepare (stores: [])
--> KSTREAM-FILTER-0000000003
<-- KSTREAM-TRANSFORMVALUES-0000000001
Processor: KSTREAM-FILTER-0000000003 (stores: [])
--> Aggregate-GroupBy
<-- Aggregate-Prepare
Processor: Aggregate-GroupBy (stores: [])
--> Aggregate-GroupBy-repartition-filter
<-- KSTREAM-FILTER-0000000003
Processor: Aggregate-GroupBy-repartition-filter (stores: [])
--> Aggregate-GroupBy-repartition-sink
<-- Aggregate-GroupBy
Sink: Aggregate-GroupBy-repartition-sink (topic: Aggregate-GroupBy-repartition)
<-- Aggregate-GroupBy-repartition-filter
Sub-topology: 1
Source: Aggregate-GroupBy-repartition-source (topics: [Aggregate-GroupBy-repartition])
--> KSTREAM-AGGREGATE-0000000005
Processor: KSTREAM-AGGREGATE-0000000005 (stores: [Aggregate-Aggregate-Materialize])
--> Aggregate-Aggregate-ToOutputSchema
<-- Aggregate-GroupBy-repartition-source
Processor: Aggregate-Aggregate-ToOutputSchema (stores: [])
--> Aggregate-Aggregate-WindowSelect
<-- KSTREAM-AGGREGATE-0000000005
Processor: Aggregate-Aggregate-WindowSelect (stores: [])
--> Aggregate-Project
<-- Aggregate-Aggregate-ToOutputSchema
Processor: Aggregate-Project (stores: [])
--> KTABLE-TOSTREAM-0000000012
<-- Aggregate-Aggregate-WindowSelect
Processor: KTABLE-TOSTREAM-0000000012 (stores: [])
--> KSTREAM-FOREACH-0000000013
<-- Aggregate-Project
Processor: KSTREAM-FOREACH-0000000013 (stores: [])
--> none
<-- KTABLE-TOSTREAM-0000000012
Was this article helpful?