OLAP场景中,为避免复杂SQL运行时间过长,程序一直阻塞等待而影响业务运行,DLA推出异步执行SQL功能,即在SQL中加入Hint/*+ run-async=true */
。异步执行SQL时,查询结果将默认写入您的OSS目录中,同时系统返回SQL对应的ID,通过show query_task
查询ID得到SQL任务的执行详情。
注意:在DLA中异步执行SQL时,必须开通OSS服务,存储SQL执行结果。
示例
例如,在DLA中通过/*+ run-async=true */
异步执行SQL,系统将返回一个ID。
mysql> /*+ run-async=true */select * from test_table1;
+--------------------------------+
| ASYNC_TASK_ID |
+--------------------------------+
| q201811021109sh8d1a0b750000182 |
+--------------------------------+
1 row in set (0.04 sec)
通过show query_task
查询ID,得到异步SQL执行详情。
mysql> show query_task where id = 'q201811021109sh8d1a0b750000182'\G
*************************** 1. row ***************************
id: q201811021109sh8d1a0b750000182
mpp_query_id: 20181102_030939_149_svnhw
status: SUCCESS
task_name: SELECT
table_schema: sh_tpch
command: /*+ run-async=true */select * from test_table1
creator_id: ${您的dla账号}
create_time: 2018-11-02 11:09:40.0
update_time: 2018-11-02 11:09:40.0
connection_id: 693929276088405
message:
row_count: 2
elapse_time: 692
scanned_data_bytes: 147
result_file_oss_file: oss://aliyun-oa-query-results-${您的uid}-oss-cn-shanghai/DLA_Result/2018/11/02/q201811021109sh8d1a0b750000182/result.csv
cancellable_task: 0
mq_product: NULL
mq_topic: NULL
mq_producer_id: NULL
mq_model: NULL
mq_status: NULL
mq_error_msg: NULL
mq_message_id: NULL
mq_total_time: NULL
1 row in set (0.02 sec)
参数说明
status
:值为
SUCCESS
时,表示SQL执行成功。值为
RUNNING
时,表示SQL正在运行中。值为
FAILURE
时,表示SQL执行失败。值为
CANCELLED
时,表示用户取消SQL执行任务。
result_file_oss_file
: 存储SQL查询结果的OSS地址。elapse_time
:执行整个SQL任务花费的时间。scanned_data_bytes
:SQL扫描的数据量,DLA根据扫描的字节(Byte)数收费。
结论
上述方法确实实现了异步执行SQL,并且也得到了SQL任务的执行详情,但需要在程序中反复执行show query_task
来确认SQL任务的状态是否从RUNNING
变为SUCCESS
,对用户的程序影响很大,急需方便、快捷的通知机制。
DLA支持将消息写入阿里云消息队列(Message Queue,简称MQ)、消息服务(Message Service,简称MNS,原MQS)或者钉钉机器人,帮助您快速、异步感知任务执行状态。