全部产品
云市场

Hints

更新时间:2020-07-02 14:28:20

MySQL客户数连接

  1. mysql -h<end_point_host> -P<end_point_port> -u<user_name> -p<password> -c -A
  2. ……………………
  3. mysql> use public_dataset_tpch_1x_text;
  4. Database changed
  5. mysql> /*+ run-async=true */select count(*) from customer;
  6. +--------------------------------+
  7. | ASYNC_TASK_ID |
  8. +--------------------------------+
  9. | q202006161430hz89aab7ef0245339 |
  10. +--------------------------------+
  11. 1 row in set (0.04 sec)

MySQL client 默认发送到服务器的 SQL statements 中删除 comments(包括优化器提示),直到 MySQL 5.7.7。如果使用小于5.7.7版本,请使用 -c 选项 支持添加 comments(包括优化器提示) 提示

通用类

run-async

  • 含义: 是否异步执行。
  • 取值范围: true, false, 默认false。

DLA的查询默认是同步执行的,也就是说客户端到DLA的连接会一直等待服务端,知道查询结果返回。但是对于一些大规模的ETL,比如 INSERT INTO SELECT FROM 这类语句,如果数据量大的话,它的执行时间是很长的,服务端长时间不返回任何数据给客户端,连接可能会中断,因此就有了“异步执行”的概念。异步执行的场景下,用户提交一个SQL,服务端马上返回一个ID,后续用户可以根据这个ID来查询SQL的执行情况。

max-running-time-sec

  • 含义: 查询最大执行的时间,单位是秒。
  • 取值范围: 大于0的整数,时间不要超过6个小时。

这个hint可以控制SQL执行的时间,如果超过这个时间,SQL就被系统自动终止掉。

join-distribution-type

  • 含义: 表在JOIN的时候使用的数据分发类型。
  • 取值范围: AUTOMATIC/BROADCAST/PARTITIONED
  • 默认值: PARTITIONED

如果右表比较小能够放进内存,采用BROADCAST会极大的提高查询的性能;而PARTITIONED没有这个限制,所以可以支持更大的JOIN,但是对于小表JOIN性能较差。

pool-selector

  • 含义: 指定查询要发送到的资源池。
  • 取值范围: -

OSS

insert-overwrite-ignore-conflict

  • 含义: 执行insert overwrite时,如果写入的目标目录已经存在,是否强制覆盖。如果指定为false,则只会覆盖元数据中有记录的目标记录;如果为true,则无论如何都会覆盖。
  • 取值范围: true/false
  • 默认值: false

JDBC

jdbc-scan-splits

  • 含义: 控制在查询JDBC类数据源时,拆分多少个split来获取数据
  • 取值范围: 1 - 500
  • 默认值: 1

jdbc-split-column

  • 含义: 查询JDBC类数据源时,选择哪一列作为切分列,注意,切分列的类型只支持INT/BIGINT和带索引的CHAR/VARCHAR类型,如果选择的切分列不属于上述类型,执行引擎会自动忽略这个参数。
  • 取值范围: 列名
  • 默认值: 无

OTS

ots-query-version

  • 含义: 是否启动V2新版本协议来查询
  • 取值范围: 1, 2
  • 默认值: 2

ots-filter-version

  • 含义: 是否启动V2新版本的filter来查询
  • 取值范围: 1, 2
  • 默认值: 2

ots-split-unit-mb

  • 含义: split默认的切分单位
  • 取值范围: 1, 2
  • 默认值: 2

ots-fetch-size

  • 含义:
  • 取值范围:
  • 默认值:

ots-start-version

  • 含义: 数据版本起点,是一个时间戳(millisecond),为了快速过滤掉大量的多版本数据
  • 默认值: -1

ots-end-version

  • 含义: 数据版本终点,是一个时间戳(millisecond),为了快速过滤掉大量的多版本数据
  • 默认值: -1

ots-split-optimize

  • 含义: 是否启动split的分组重排等优化逻辑
  • 取值范围: true/false
  • 默认值: false

ots-split-size-ratio

  • 含义: 启动split的分组重排等优化逻辑之后,希望split的数量
  • 取值范围: 0.0001 - 1.0
  • 默认值: 0.5

ots-partition-prune

  • 含义: 是否启动split的范围再做裁剪优化,加快性能
  • 取值范围: true/false
  • 默认值: true

ots-insert-as-update

  • 含义: 是否使用update功能来替换insert
  • 取值范围: true/false
  • 默认值: false

ots-loose-cast

  • 含义: 是否允许使用宽松的cast(比如long值到double,double到long)
  • 取值范围: true/false
  • 默认值: false

ots-index-first

  • 含义: 是否对于某些满足条件的表做索引优先查询。
  • 取值范围
    • auto: 会寻找与表相关的索引,只要有满足条件的索引,就会强制使用
    • custom: 根据用户选择表列表,来自动选择满足条件的索引;其中tbl1不需要显示指定库名,是因为当前连接上已经绑定了一个库(比如use xxx);如下case中,只有tbl1和tbl2会走索引,而tbl3则不会:
  1. /*+ ots-index-first=[tbl1, dla_schema2.tbl2, ...] */ select * from tbl1
  2. join dla_schema2.tbl2 join dla_schema3.tbl3 where ...
  • threshold: 根据当前条件匹配的数据量来动态决策,如果找到一个索引,其匹配的数据量小于一定的行数或者一定比例,那就会自动选择;threshold:200表示where条件匹配的行数不超过200行才会使用,而threshold:5%则表示匹配的比例不超过5%才会使用(至于200和5%,DLA内部会调用Table Store的count接口做快速测试并预估判断)
  1. /*+ ots-index-first=threshold:200 */ select * from tbl1 where ...
  2. /*+ ots-index-first=threshold:5% */ select * from tbl1 where ...
  • 默认值: 不使用索引

消息通知

DLA支持对SQL在执行完成之后进行异步通知,目前支持两种通知渠道,对应的hint组合如下:

ONS

  1. /*+ run-async=true, mq-notify-by=ons, mq-topic=${您的ons的topic},
  2. mq-producer-id=${您的group Id}, mq-endpoint=${您的某个endpoint,与DLA所在region相同} */
  • mq-notify-by: 消息渠道的名称
  • mq-topic: ons的topic
  • mq-producer-id: ons的group Id
  • mq-endpoint: ons的endpoint

MNS

  1. /*+ run_async=true, mq-notify-by=mns, mq-queue=${您的mns队列} */
  • mq-notify-by: 消息渠道的名称
  • mq-queue: 您的mns队列

异步查询结果导出

当你使用异步执行的时候,执行的结果会被导出到OSS上,默认保存的CSV格式的,我们也提供了一些hint可以对保存的格式进行调整:

  • result-file-format: 目前支持csv/json。
  • result-col-del: 列分隔符(只有在格式为CSV的时候才有作用)
  • result-row-del: 行分隔符(只有在格式为CSV的时候才有作用)
  • result-meta-included: 是否要在第一行输出列名称(默认是不包含的)
  • result-oss-location: 结果文件的OSS目录。

很多客户希望用’,’而不是’|’作为分隔符,因为’,’本身有特殊语义,目前通过[,]来转义,比如result-col-del=[,], result-row-del=\r\n

有时候我们使用同步查询的时候也想把结果保存一份到OSS上,可以用这个hint:

  • force-persist-result=true