SQL完全精确

本文介绍SQL完全精确的实现原理和操作步骤,帮助您快速掌握其核心能力。

使用限制

以下功能暂不支持SQL完全精确:

实现原理

完全精确模式以时间换资源的方式确保结果精确完整。通过将各类资源约束统一转化为时间维度,在用户指定的时间范围内,查询任务将在安全水位下稳定运行,直至结果精确,或执行超时。在技术实现方面,我们采用了多种策略:基于隔离资源池的任务分配、针对用户的队列优先级控制以及根据任务类型(如计算密集型、IO密集型)进行负载划分。这些措施有效实现了资源的合理调度与高效利用,从而确保最终结果的精确性。

image

如下图:普通查询将在即时计算资源池中运行,当Query触发限制,将即时截断,显示结果不精确。当开启 SQL 完全精确模式时,Query将在专属的精确计算资源池中执行。即便触发资源限制,系统仍会确保任务在安全水位下稳定运行,直至数据完全加载并完成精确计算。

image

前提条件

操作步骤

日志服务支持单次开启方式:仅当前Logstore下的查询和分析操作,使用完全精确模式。

说明

您可以通过控制台、APISDK三种方式设置完全精确模式的最大超时时间。分析操作的最大超时的时间为55秒。

控制台

  1. 登录日志服务控制台

  2. Project列表区域,单击目标Project。

    image

  3. 日志存储 > 日志库页签中,单击目标Logstore。

    image

  4. 单击image > 完全精确

    重要

    您可以通过设置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 。

    image

API

  • 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 。

  • 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为例。

前提条件

安装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 IDAccessKey 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