扫描(Scan)分析概述

日志服务扫描分析功能支持免配置索引进行目标字段的扫描,用于分析相关日志。本文介绍扫描分析功能的相关信息。

背景信息

日志服务基于索引技术,提供快速查询和分析日志功能,但在某些场景下可能会遇到如下限制,无法创建或使用索引。

  • 为降低使用费用,而未对某些字段建立索引,但临时急需查询历史日志。

  • 字段值长度超过了索引限制,超出部分无法被查询。

  • 字段名较多,事先无法获取具体的字段名,无法建立字段索引。

  • 字段类型发生变化,无法查询。

针对上述问题,日志服务推出扫描查询和扫描分析功能,用于查询和分析日志,无需对扫描的目标字段建立索引。关于扫描查询的更多信息,请参见扫描(Scan)查询概述

基本语法

  • 基本语法

    在标准SQL前面,加上set session mode=scan; 表示使用扫描模式。

    查询语句 | set session mode=scan;分析语句(标准SQL)
  • 使用示例

    * and status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY api

工作流程

日志服务接收到扫描请求后,执行流程主要分为如下两步。

  1. 先执行对应的查询语句进行日志查询。

    重要

    查询语句仍依赖于索引。例如执行status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY api语句前,您需为status字段创建索引,但无需为api字段创建索引。

  2. 根据SQL语句中的字段,扫描上述查询结果,提取这些字段对应的数据。

  3. 执行SQL语句,对上述提取到的字段数据进行聚合分析,并返回最终的分析结果。

扫描分析与索引分析的对比

对比项

索引分析

扫描分析

语法

查询语句 | 分析语句(标准SQL)

查询语句 | set session mode=scan; 分析语句(标准SQL)

是否需要配置索引

需要配置字段索引,并开启统计功能。

不需要。

重要

竖线(|)前的查询语句仍依赖于索引。

SQL语法

支持丰富的SQL语法和SQL函数。更多信息,请参见函数概览

支持索引模式下的全部的SQL语法和SQL函数。部分场景下存在一定的使用限制,请参见使用限制

分析能力

支持亿级别的数据量。更多信息,请参见分析概述

开启SQL独享版可以获得更强的分析能力。

相对较弱,适用于百万级别的数据量。

针对数据量大的场景,推荐结合查询语句(需要创建索引),先过滤日志。

是否收费

索引流量和索引存储费用。更多信息,请参见按使用功能计费模式计费项

扫描部分按照流量收费,即基于索引查询后扫描命中的数据量收费。

使用限制

  • 扫描分析模式下,所有字段均被视为varchar类型。

    如果需要其他类型,请使用cast函数进行转换。具体操作,请参见cast函数

    例如计算每个接口的平均延时,其中avg函数需要数值类型,即需要先使用cast函数将latency字段的类型转换为bigint类型。

    status:200 | set session mode=scan;SELECT avg(cast(latency AS bigint)) AS '平均延时', api GROUP BY api
  • 扫描分析模式下,日志服务通过扫描方式提取SQL语句中所有字段对应的日志,已有的字段索引不生效。

    例如已为status字段创建long类型的字段索引,如果在扫描模式下使用如下语句,则status字段的索引不生效。

    * | set session mode=scan;SELECT count(1) AS pv, api WHERE cast(status AS bigint) = 200 GROUP BY api

    在此场景下,建议使用如下语句。

    说明

    对于有索引的字段,建议放到竖线(|)前面,作为过滤条件。

    status:200 | set session mode=scan;SELECT count(1) as pv, api GROUP BY api
  • 扫描分析模式下,分析的数据量有限。限制单Shard只支持分析50万条日志,限制扫描总行数为1000万条日志(如果有查询语句,是指过滤后的日志条数),超出该限制后,返回部分日志的计算结果,并提示结果不精确。

    您可以通过如下方法,尽量避免查询结果不精确。

    • 针对大规模结构化数据,建议使用索引分析模式(创建字段索引,并开启统计)。

    • 建议使用查询语句(创建索引)进行预过滤,减少需要扫描的数据量。

    • 建议缩小时间范围,减少需要扫描的数据量。

  • 扫描分析模式下,不支持*|select *语句。

  • 扫描分析模式下,对多个Logstore进行JOIN分析时,需在字段名前面加上Logstore名称,格式为LogstoreName.key