Application Development
Table API & SQL
SQL
EXPLAIN Statements
EXPLAIN Statements
EXPLAIN statements are used to explain the logical and optimized query plans of a query or an INSERT statement.
Run an EXPLAIN statement
EXPLAIN statements can be executed with the executeSql()
method of the TableEnvironment
, or executed in SQL CLI . The executeSql()
method returns explain result for a successful EXPLAIN operation, otherwise will throw an exception.
The following examples show how to run an EXPLAIN statement in TableEnvironment
and in SQL CLI.
StreamExecutionEnvironment env = StreamExecutionEnvironment . getExecutionEnvironment ();
StreamTableEnvironment tEnv = StreamTableEnvironment . create ( env );
// register a table named "Orders"
tEnv . executeSql ( "CREATE TABLE MyTable1 (count bigint, work VARCHAR(256) WITH (...)" );
tEnv . executeSql ( "CREATE TABLE MyTable2 (count bigint, work VARCHAR(256) WITH (...)" );
// explain SELECT statement through TableEnvironment.explainSql()
String explanation = tEnv . explainSql (
"SELECT count, word FROM MyTable1 WHERE word LIKE 'F%' " +
"UNION ALL " +
"SELECT count, word FROM MyTable2" );
System . out . println ( explanation );
// explain SELECT statement through TableEnvironment.executeSql()
TableResult tableResult = tEnv . executeSql (
"EXPLAIN PLAN FOR " +
"SELECT count, word FROM MyTable1 WHERE word LIKE 'F%' " +
"UNION ALL " +
"SELECT count, word FROM MyTable2" );
tableResult . print ();
val env = StreamExecutionEnvironment . getExecutionEnvironment ()
val tEnv = StreamTableEnvironment . create ( env )
// register a table named "Orders"
tEnv . executeSql ( "CREATE TABLE MyTable1 (count bigint, work VARCHAR(256) WITH (...)" )
tEnv . executeSql ( "CREATE TABLE MyTable2 (count bigint, work VARCHAR(256) WITH (...)" )
// explain SELECT statement through TableEnvironment.explainSql()
val explanation = tEnv . explainSql (
"SELECT count, word FROM MyTable1 WHERE word LIKE 'F%' " +
"UNION ALL " +
"SELECT count, word FROM MyTable2" )
println ( explanation )
// explain SELECT statement through TableEnvironment.executeSql()
val tableResult = tEnv . executeSql (
"EXPLAIN PLAN FOR " +
"SELECT count, word FROM MyTable1 WHERE word LIKE 'F%' " +
"UNION ALL " +
"SELECT count, word FROM MyTable2" )
tableResult . print ()
settings = EnvironmentSettings . new_instance ()...
table_env = StreamTableEnvironment . create ( env , settings )
t_env . execute_sql ( "CREATE TABLE MyTable1 (count bigint, work VARCHAR(256) WITH (...)" )
t_env . execute_sql ( "CREATE TABLE MyTable2 (count bigint, work VARCHAR(256) WITH (...)" )
# explain SELECT statement through TableEnvironment.explain_sql()
explanation1 = t_env . explain_sql (
"SELECT count, word FROM MyTable1 WHERE word LIKE 'F%' "
"UNION ALL "
"SELECT count, word FROM MyTable2" )
print ( explanation1 )
# explain SELECT statement through TableEnvironment.execute_sql()
table_result = t_env . execute_sql (
"EXPLAIN PLAN FOR "
"SELECT count, word FROM MyTable1 WHERE word LIKE 'F%' "
"UNION ALL "
"SELECT count, word FROM MyTable2" )
table_result . print ()
Flink SQL > CREATE TABLE MyTable1 ( count bigint , work VARCHAR ( 256 );
[ INFO ] Table has been created .
Flink SQL > CREATE TABLE MyTable2 ( count bigint , work VARCHAR ( 256 );
[ INFO ] Table has been created .
Flink SQL > EXPLAIN PLAN FOR SELECT count , word FROM MyTable1 WHERE word LIKE 'F%'
> UNION ALL
> SELECT count , word FROM MyTable2 ;
The EXPLAIN
result is:
== Abstract Syntax Tree ==
LogicalUnion(all=[true])
LogicalFilter(condition=[LIKE($1, _UTF-16LE'F%')])
FlinkLogicalTableSourceScan(table=[[default_catalog, default_database, MyTable1]], fields=[count, word])
FlinkLogicalTableSourceScan(table=[[default_catalog, default_database, MyTable2]], fields=[count, word])
== Optimized Logical Plan ==
DataStreamUnion(all=[true], union all=[count, word])
DataStreamCalc(select=[count, word], where=[LIKE(word, _UTF-16LE'F%')])
TableSourceScan(table=[[default_catalog, default_database, MyTable1]], fields=[count, word])
TableSourceScan(table=[[default_catalog, default_database, MyTable2]], fields=[count, word])
== Physical Execution Plan ==
Stage 1 : Data Source
content : collect elements with CollectionInputFormat
Stage 2 : Data Source
content : collect elements with CollectionInputFormat
Stage 3 : Operator
content : from: (count, word)
ship_strategy : REBALANCE
Stage 4 : Operator
content : where: (LIKE(word, _UTF-16LE'F%')), select: (count, word)
ship_strategy : FORWARD
Stage 5 : Operator
content : from: (count, word)
ship_strategy : REBALANCE
Back to top
Syntax
EXPLAIN PLAN FOR < query_statement_or_insert_statement >
For query syntax, please refer to Queries page.
For INSERT, please refer to INSERT page.