简述

  • SQL hints 写在 SQL 表达式里用于修改执行计划。

  • 通常它可用于:

    • 强制 planner: 没有完美的 planner,因此用户可以通过它更好地控制执行器;
    • 添加元数据或统计信息:“用于 scan 的表索引”、“某些 shuffle keys 的倾斜信息” 这些统计信息对于查询是动态的,来自 planner 的元数据信息经常会失真,用户可以通过配置 hints 方便地告知 planner;
    • 操作资源限制:很多情况下,我们给执行算子一个默认的资源配置。如最小并行度、managed memory 或特殊的资源要求(GPU、SSD)等, 可以在每次查询中配置 hint 来灵活地修改资源分配

动态表选项

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

适用于交互界面中的每次即时查询。

如在 SQL-CLI 中,可以指定动态选项 /+ OPTIONS(‘csv.ignore-parse-errors’=’true’) / 来忽略 csv 数据源的解析错误。

  • 注意:动态表选项默认是被禁止的,因为它可能变更查询的语义。需要将配置 table.dynamic-table-options.enabled 改为 true (默认 false)

  • 详细配置项见 配置

    语法

    为了不破坏 SQL 的兼容性,采用了 Oracle 形式的 SQL hint 语法: ```sql table_path /+ OPTIONS(key=val [, key=val]) */

key: stringLiteral val: stringLiteral


# 示例
```sql
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;