暴力扫描主要指对分区或过滤条件使用不当,导致数据计算过程中扫描全表数据或超大体量数据,潜在地会导致计算资源的极大浪费。暴力扫描的检查项能够帮助用户提前评估查询的分区量级和数据量级,从而对数据查询范围进行合理评估,识别代码问题并优化代码逻辑,有效降低计算资源的浪费。
适用数据源
MaxCompute
判断规则
如果符合以下任一条件,则将被识别为暴力扫描:
表中被查询的一级分区数大于或等于设定的“最大可读取一级分区数”的检查项阈值。建议按日分区或小时分区的常规读取最大跨度进行设定。如果无需管控该维度,可将阈值设定为999999。
示例:如果用户一级分区按天保存,共有1000个分区,而阈值设定为30个,当单次查询时一级分区总共命中90天分区,则会触发暴力扫描识别。
表中被查询的分区数占比大于或等于设定的“最大可读取分区数比例”的检查项阈值。建议设定常规业务符合的查询范围。例如通常表只保存一年数据,日常查询几乎不超过半年跨度,则可将阈值设定为50%,如果无需管控该维度,可设定为100%。
示例:如果用户分区表包含3650个分区,而阈值设置为10%,则如果单次查询范围超过1000个分区,则会触发暴力扫描识别。
表中被读取的数据存储量大于或等于设定的“最大可读取数据量大小”的检查项阈值。建议根据大部分工作空间表大小情况,设定单次查询时的合理读取阈值。
示例:如果阈值设置为1 TB,而用户单次查询所读取的数据量为2 TB,则会触发暴力扫描识别。
常见需要避免的暴力扫描情况:
查询分区大表时,读取时没有添加分区限制条件,导致全表扫描。
查询分区大表时,虽然存在分区过滤条件,但涉及的时间跨度过大,导致近乎全表分区被扫描。
分区过滤条件或SQL写法有误,导致对分区条件的范围限定在实际运行时没有生效。
处理指南
消除暴力扫描的常用方法包括以下几种:
添加分区过滤条件以减少扫描分区数。
对中间小表进行拆分,然后扫描小表的历史分区以减少数据扫描量。
将分区限定条件上移,写入到子查询中以消除暴力扫描。
对于需要每天扫描计算大量分区的表,可以通过拆分出一张中间表,每天进行一次汇总。
核对分区过滤条件,修正编码错误导致的分区限定条件失效问题。
注意事项
需满足以下条件才会触发该检查:
SQL中使用的参数没有遗漏。
SQL中使用的表已经存在。
SQL中没有使用上下文参数。
SQL中语法检查通过。