Wait the light to fall

SQL 提示

焉知非鱼

SQL Hints

SQL 提示

SQL 提示可以与 SQL 语句一起使用,以改变执行计划。本章解释了如何使用提示来强制各种方法。

一般来说,一个提示可以用来。

强制执行计划器:没有完美的计划器,所以实现提示让用户更好地控制执行是有意义的。 Append meta data(或统计):一些统计,比如"扫描的表索引"和 “一些 shuffle 键的 skew info”,对于查询来说是有些动态的,用提示来配置它们会非常方便,因为我们从 planner 得到的规划元数据往往不是那么准确。 运算符资源约束:对于很多情况,我们会给执行运算符一个默认的资源配置,比如最小并行或管理内存(耗费资源的 UDF)或特殊的资源需求(GPU 或 SSD 磁盘)等等,用提示对每个查询(而不是 Job)的资源进行配置会非常灵活。

动态表选项 #

动态表选项允许动态指定或覆盖表选项,与 SQL DDL 或连接 API 定义的静态表选项不同,这些选项可以在每个查询中的每个表范围内灵活指定。

因此,它非常适用于交互式终端的临时查询,例如,在 SQL-CLI 中,只需添加一个动态选项 /*+ OPTIONS('csv.ignore-parse-errors'='true') */,就可以指定忽略 CSV 源的解析错误。

注意:动态表选项默认是禁止使用的,因为它可能会改变查询的语义。您需要将配置选项 table.dynamic-table-options.enabled 显式地设置为 true(默认为 false),有关如何设置配置选项的详细信息,请参阅配置

语法 #

为了不破坏 SQL 的兼容性,我们使用 Oracle 风格的 SQL 提示语法。

table_path /*+ OPTIONS(key=val [, key=val]*) */

key:
    stringLiteral
val:
    stringLiteral

例子 #

CREATE TABLE kafka_table1 (id BIGINT, name STRING, age INT) WITH (...);
CREATE TABLE kafka_table2 (id BIGINT, name STRING, age INT) WITH (...);

-- override table options in query source
select id, name from kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */;

-- override table options in join
select * from
    kafka_table1 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */ t1
    join
    kafka_table2 /*+ OPTIONS('scan.startup.mode'='earliest-offset') */ t2
    on t1.id = t2.id;

-- override table options for INSERT target table
insert into kafka_table1 /*+ OPTIONS('sink.partitioner'='round-robin') */ select * from kafka_table2;

原文链接: https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/sql/hints.html