日志服务扫描分析功能支持免配置索引进行目标字段的扫描,用于分析相关日志。本文介绍扫描分析功能的相关信息。
背景信息
日志服务基于索引技术,提供快速查询和分析日志功能,但在某些场景下可能会遇到如下限制,无法创建或使用索引。
为降低使用费用,而未对某些字段建立索引,但临时急需查询历史日志。
字段值长度超过了索引限制,超出部分无法被查询。
字段名较多,事先无法获取具体的字段名,无法建立字段索引。
字段类型发生变化,无法查询。
针对上述问题,日志服务推出扫描查询和扫描分析功能,用于查询和分析日志,无需对扫描的目标字段建立索引。关于扫描查询的更多信息,请参见扫描(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
工作流程
日志服务接收到扫描请求后,执行流程主要分为如下两步。
先执行对应的查询语句进行日志查询。
重要查询语句仍依赖于索引。例如执行
status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY api
语句前,您需为status字段创建索引,但无需为api字段创建索引。根据SQL语句中的字段,扫描上述查询结果,提取这些字段对应的数据。
执行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
。