查询与分析常见问题

本文介绍定时SQL功能的常见问题。

如何保证SQL分析的数据准确性?

数据延迟写入或实例的调度配置不恰当时,可能发生数据分析不准确问题。

  • 数据写入存在延迟。例如数据写入日志服务延迟了5分钟,实例执行时间为12:03:00,SQL时间窗口为相对一分钟,即[12:02:00,12:03:00),则查询不到最新的数据。

  • 数据写入日志服务到能够被查询到,这期间存在延时(一般少于3秒)。即使延时很低,也存在数据漏查的风险。例如实例执行时间为12:03:30,SQL时间窗口为相对一分钟,即[12:02:30,12:03:30),对于12:03:29秒写入的日志,不能保证在12:03:30肯定能够查询到。

  • 同一分钟内包含不同时间的日志时,由于日志索引的构建,时间较迟的日志的索引可能落盘到较早的时间点。例如实例执行时间为12:03:30,SQL时间窗口为相对一分钟,即[12:02:30,12:03:30)。如果在12:02:50写入日志,这些日志时间为12:02:20、12:02:50等,那么这些日志的索引可能落盘在12:02:20这个时间点,导致在[12:02:30,12:03:30)期间查询不到日志。

使用定时SQL时,建议根据业务情况,同时兼顾数据实时性和准确性。

  • 考虑到数据上传日志服务存在延迟情况,您可以结合数据采集延迟以及业务能够容忍的最大结果可见延迟,设置执行延迟SQL时间窗口(结束时间往前一点),避免实例执行时SQL时间窗口内的数据未全部到达。

  • 建议SQL时间窗口按分钟对齐(例如整分钟、整小时),以保证上传局部乱序数据时的数据准确性。

如何防止SQL分析执行失败?

  • 确保输入正确的SQL语法。

  • 确保已为待分析的字段创建正确的索引。例如查询和分析语句为* | select uid,则您需要为uid字段开启统计功能。更多信息,请参见创建索引

  • 确保已配置正确的权限。例如执行SQL分析的权限和读取日志库数据的权限。

  • 确保已提供足够的计算资源。资源限制说明请参见查询与分析的使用限制

  • 避免使用逻辑过于复杂的SQL语句以及SQL时间窗口设置过大,否则将导致计算超时(服务端超时时间为10分钟)。

通过定时SQL任务写入数据到目标库时,是否进行索引检查?

日志服务将定时SQL的计算结果写入目标库时,不做索引检查。如果目标库未配置索引,则您无法进行SQL分析,但不影响日志消费和查询操作。

建议您在创建定时SQL任务前,完成目标库的索引配置。如果未提前配置索引,可通过重建索引功能为历史数据配置索引。具体操作,请参见重建索引

某个实例执行超时,是否会影响后续的执行计划?

某个实例执行超时不会影响后续的执行计划的生成。新实例的调度时间是延续上一个实例的调度时间,但是后续实例的创建时间和执行时间会延迟,并且需要花费时间来追赶原定的执行计划,逐步缩减结果数据的延迟。

一般来说,追赶固定的数据量时,调度周期越大,追赶速度越快。例如:

  • 追赶一天的数据量,调度周期为1分钟时,需要执行1440个实例,每个实例运行20秒。

  • 追赶一天的数据量,调度周期为1小时时,需要执行24个实例,每个实例运行2分钟。

    日志服务提供服务分布式查询和分析能力,在面对更多数据时将使用更多的计算资源。

写入到目标库的数据如何溯源?

通过定时SQL写入到目标库的数据,默认被添加如下__tag__字段,用于数据溯源。

  • __tag__:__instance_id__:2b****06a:实例的ID

  • __tag__:__job__:from_now:任务名称

  • __tag__:__project__:ali-sls-etl-staging:任务所属于的Project

  • __tag__:__schedule_time__:1618474200:任务的调度时间,Unix时间戳,单位:秒。

  • __tag__:__trigger_time__:1618474259:任务的执行时间,Unix时间戳,单位:秒。

如何自定义定时SQL任务写入日志到目标库的日志时间?

根据业务情况,如果需要通过日志时间进行查询分析等操作,且不希望日志时间值是默认指定的,那么您可以通过如下案例来自定义任务将日志写入目标库的日志时间值。

说明

定时SQL任务写入日志到目标库的日志时间值是什么?

创建定时SQL任务时,SQL代码不包含__time__字段(* | select * 默认包含__time__字段),定时SQL任务写入日志到目标库的日志时间值默认会指定为数据时间的开始时间。

如图所示:系统默认会把SQL查询区间数据时间的开始时间2024-09-14 15:31:00指定为该实例查询的结果日志写入目标库的日志时间值。

image

案例一:指定源日志库的日志时间为写入到目标日志库的日志时间

在创建定时SQL任务时,SQL中除了需要写入到目标库的必要字段,加入__time__字段,则当日志从源日志库写入到目标日志库时,系统会把该语句执行结果__time__值作为写入日志到目标库的日志时间值。

image

案例二:指定当前时间为写入到目标库的日志时间值

在创建定时SQL任务时,SQL中除了需要写入到目标库的必须字段,加入cast(to_unixtime(current_timestamp) as bigint) AS __time__字段,则指定当前时间为写入到目标库的日志时间值。关于to_unixtime函数更多信息,请参见to_unixtime函数。关于cast函数更多信息,请参见cast函数

image

案例三:指定源日志其他时间字段值为写入日志到目标库日志的日志时间值

如图所示:将配置在SQL代码中的start_time替换为您日志中的真实字段,且字段值应为timestamp类型,系统会把该语句执行结果__time__值作为写入日志到目标库的日志时间值。

image