本文介绍SQL完全精确的实现原理和操作步骤,帮助您快速掌握其核心能力。
使用限制
以下功能暂不支持SQL完全精确:
实现原理
完全精确模式以时间换资源的方式确保结果精确完整。通过将各类资源约束统一转化为时间维度,在用户指定的时间范围内,查询任务将在安全水位下稳定运行,直至结果精确,或执行超时。在技术实现方面,我们采用了多种策略:基于隔离资源池的任务分配、针对用户的队列优先级控制以及根据任务类型(如计算密集型、IO密集型)进行负载划分。这些措施有效实现了资源的合理调度与高效利用,从而确保最终结果的精确性。
如下图:普通查询将在即时计算资源池中运行,当Query触发限制,将即时截断,显示结果不精确。当开启 SQL 完全精确模式时,Query将在专属的精确计算资源池中执行。即便触发资源限制,系统仍会确保任务在安全水位下稳定运行,直至数据完全加载并完成精确计算。
前提条件
已创建Standard Logstore。具体操作,请参见创建Logstore。
已采集日志。具体操作,请参见数据采集。
已配置索引。具体操作,请参见配置索引。
操作步骤
日志服务支持单次开启方式:仅当前Logstore下的查询和分析操作,使用完全精确模式。
您可以通过控制台、API和SDK三种方式设置完全精确模式的最大超时时间。分析操作的最大超时的时间为55秒。
控制台
登录日志服务控制台。
在Project列表区域,单击目标Project。
在
页签中,单击目标Logstore。单击
。重要您可以通过设置
query_max_run_time
参数来调整超时时间。例如查询分析语句为
* | select count(*) as pv
,在分析语句中增加set session query_max_run_time=10s;
,查询分析语句为:* | set session query_max_run_time=10s; select count(*) as pv
。
API
参数
query
例如查询分析语句为
* | select count(*) as pv
。使用完全精确:在分析语句中增加
set session allow_incomplete=false;
,表示使用完全精确。查询分析语句为:* | set session allow_incomplete=false; select count(*) as pv
。设置查询分析超时时间:在分析语句中增加
set session query_max_run_time=10s;
,表示该语句最大执行时间为10s
。查询分析语句为:* | set session allow_incomplete=false; select count(*) as pv
。同时设置完全精确和超时时间:查询分析语句为:
* | set session allow_incomplete=false;query_max_run_time=10s;select count(*) as pv
。
GetLogsV2(返回结果压缩后传输) - 查询Logstore中的日志数据
参数
query
例如查询分析语句为
* | select count(*) as pv
。使用完全精确:在分析语句中增加
set session allow_incomplete=false;
,表示使用完全精确。查询分析语句为:* | set session allow_incomplete=false; select count(*) as pv
。设置查询分析超时时间:在分析语句中增加
set session query_max_run_time=10s;
,表示该语句最大执行时间为10s
。查询分析语句为:* | set session allow_incomplete=false; select count(*) as pv
。同时设置完全精确和超时时间:查询分析语句为:
* | set session allow_incomplete=false;query_max_run_time=10s;select count(*) as pv
。
SDK
此处以Java SDK为例。
前提条件
GetLogs()方法
参数
query
例如查询分析语句为
* | select count(*) as pv
。使用完全精确:在分析语句中增加
set session allow_incomplete=false;
,表示使用完全精确。查询分析语句为:* | set session allow_incomplete=false; select count(*) as pv
。设置查询分析超时时间:在分析语句中增加
set session query_max_run_time=10s;
,表示该语句最大执行时间为10s
。查询分析语句为:* | set session allow_incomplete=false; select count(*) as pv
。同时设置完全精确和超时时间:查询分析语句为:
* | set session allow_incomplete=false;query_max_run_time=10s;select count(*) as pv
。
参数
session
使用完全精确:
request.SetSession("allow_incomplete=false");
。设置查询分析超时时间:
request.SetSession("query_max_run_time=10s");
。同时设置完全精确和超时时间:
request.SetSession("allow_incomplete=false;query_max_run_time=10s")
。
import com.aliyun.openservices.log.Client; import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.request.GetLogsRequest; import com.aliyun.openservices.log.response.GetLogsResponse; public class CrearteLogStore { public static void main(String[] args) throws LogException { // 本示例从环境变量中获取AccessKey ID和AccessKey Secret。 String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); // 设置日志服务的服务接入点。此处以杭州为例,其它地域请根据实际情况填写。 String host = "https://cn-beijing.log.aliyuncs.com"; // 创建日志服务Client。 Client client = new Client(host, accessId, accessKey); // 输入Project名称。 String projectName = "aliyun-test-project"; // logstore名称 String logstore = "request_log"; String query = "* | SELECT count(0)"; int from = (int)(System.currentTimeMillis()/1000) - 60; int to = (int)(System.currentTimeMillis()/1000); GetLogsRequest request = new GetLogsRequest(projectName, logstore, from, to, "", query); request.SetSession("allow_incomplete=false;query_max_run_time=10s"); GetLogsResponse response = client.GetLogs(request); System.out.println(response.getCpuSec()); } }
常见问题
如何获取CPU时间?
执行查询和分析操作后,将鼠标悬浮在分析结果上,查看CPU时间,如下图所示。
使用一次SQL独享版的费用是多少?
在不同的数据量中执行不同的查询和分析语句,会产生不同的SQL独享版费用,案例如下表所示。
查询和分析语句
数据量(行)
平均每次的费用(元)
* | select avg(double_0) from stress_s1_mil1
40亿
0.030
* | select avg(double_0), sum(double_0), max(double_0), min(double_0), count(double_0) from stress_s1_mil1
40亿
0.044
* | select avg(double_0), sum(double_1), max(double_2), min(double_3), count(double_4) from stress_s1_mil1
40亿
0.092
* | select key_0 , avg(double_0) as pv from stress_s1_mil1 group by key_0 order by pv desc limit 1000
40亿
0.080
* | select long_0, avg(double_0) as pv from stress_s1_mil1 group by long_0 order by pv desc limit 1000
40亿
0.075
* | select long_0, long_1, avg(double_0) as pv from stress_s1_mil1 group by long_0,long_1 order by pv desc limit 1000
3亿
0.073
* | select avg(double_0) from stress_s1_mil1 where key_0='key_987'
40亿
0.0005