本文介绍过滤条件不下推的使用场景与方法。

功能介绍

云原生数据仓库AnalyticDB MySQL版在创建表时,默认为所有的字段创建了索引,使数据过滤的效率更高。然而在某些场景中,使用索引过滤数据不一定能得到较好的性能,甚至会影响整体性能。此时不建议继续使用索引进行数据过滤。虽然用户可以手动删除某些字段的索引,但这种做法可能导致需要使用索引时却没有索引可用的问题。云原生数据仓库AnalyticDB MySQL版过滤条件不下推功能,可以在查询级别或实例级别暂时蔽掉某些字段的过滤条件下推能力,带来更好整体查询收益。

以下场景不建议使用索引过滤数据:
  • 数据唯一值少。数据唯一值较少,意味着数据经过过滤后返回的数据仍然很多,那么使用索引进行数据过滤的效果可能不一定好。
  • 磁盘IO压力大。如果用户业务的查询特征是占用较多的IO资源,或者数据写入较多导致占用了较多IO资源,那么使用索引进行数据过滤时,存在磁盘IO资源的争抢,过滤效果也可能较差。
  • 同时有多个条件下推,且下推的条件中有LIKE、字符串比较等比较复杂的操作时,会对存储节点相关资源消耗很大,影响整体的性能。

查看过滤条件是否下推

您可以通过执行页面查看过滤条件是否下推。

  1. 在查询的执行计划页签,单击包含TableScan算子的Stage。
    说明 进入执行计划页签的步骤,请参见查看诊断结果
  2. 单击查看Stage计划
  3. 在Stage计划页面,单击TableScan算子。
  4. 在右侧属性中,查看是否显示PushedDownFilter属性。如果显示,表示该过滤条件已下推;否则表示没有下推的过滤条件。sql-exe-plan-attribute
    说明 通过执行计划,也可以确认过滤条件是否下推。
    • 弹性模式的集群,您可以查看下游Stage的执行计划中是否显示Filter算子。如果显示则表示该算子相关的过滤条件没有下推。
    • 预留模式的集群,您可以查看当前Stage计划中是否显示Filter算子。如果显示则表示该算子相关的过滤条件没有下推。

查询级别关闭特定字段的过滤条件下推能力

针对某个查询,使用Hint关闭某些字段的过滤条件下推。只对使用了Hint的查询生效,其他查询不受影响。

语法:

内核版本为3.1.4及以上,请使用下面的Hint:
/*+ filter_not_pushdown_columns=[${database}.${tableName}:${col1Name}|${col2Name}] */
内核版本为3.1.4以下,请使用下面的Hint:
/*+ no_index_columns=[${tableName}.${col1Name};${col2Name},${tableName1}.${col1Name}] */
说明 查询内核版本的方法,请参见如何查看实例版本信息

示例1:

以3.1.4及以上的内核版本为例,当前查询,包含字段idproduct(均属于表table01)的过滤条件不会下推。

/*+ filter_not_pushdown_columns=[test01.table01:id|product] */

示例2:

以3.1.4以下的内核版本为例,当前查询,包含字段id(属于表table02)、字段product(属于表table02)、字段key(属于表table03)的过滤条件不会下推。

/*+ no_index_columns=[table02.id;product,table03.key] */

集群级别关闭特定字段的过滤条件下推能力

您可以执行以下命令,对当前集群的所有查询,关闭特定字段的过滤条件下推能力。

语法:

内核版本为3.1.4及以上版本,请使用下方语句:
set adb_config filter_not_pushdown_columns=[${database}.${tableName}:${col1Name}|${col2Name}]
内核版本为3.1.4以下,请使用下面的语句:
set adb_config no_index_columns=[${tableName}.${col1Name};${col2Name},${tableName1}.${col1Name}]
说明 查询内核版本的方法,请参见如何查看实例版本信息

示例:

以3.1.4及以上的内核版本为例,当前实例的所有查询中,只要过滤条件包含字段id(属于数据库test02的表table02),该过滤条件就不下推。

set adb_config filter_not_pushdown_columns=[test02.table02:id]