本文介绍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; set session 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; set session 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; set session 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 
 > 完全精确
 > 完全精确