过滤条件不下推

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

功能介绍

云原生数据仓库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=[Schema1.table1:colName1|colName2;Schema2.table2:colName1|colName2] */
  • 内核版本为3.1.4以下,请使用下面的Hint:

    /*+ no_index_columns=[table1.colName1;colName2,table2.colName1] */
重要
  • 关闭特定字段的过滤条件下推能力既支持对同一个数据库中的表使用Hint,也支持对不同数据库中的表使用Hint。当3.1.4以下版本,跨库使用Hint时,需要保证两个库中的表名不同,否则Hint可能会影响到不需要生效的表。3.1.4及以上版本的Hint通过Schema.table区分不同表,对不同库中相同表名的表使用Hint时,不会影响查询结果。

  • 查询内核版本的方法,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。

示例

  • 示例1:

    以3.1.4及以上的内核版本为例,当前查询,包含数据库test01的表table01中字段idproduct的过滤条件不会下推。

    /*+ filter_not_pushdown_columns=[test01.table01:id|product] */
  • 示例2:

    以3.1.4及以上的内核版本为例,当前查询,包含数据库test01的表table01中字段idproduct,数据库test02的表table03中字段key的过滤条件不会下推。

    /*+ filter_not_pushdown_columns=[test01.table01:id|product;test02.table03:key] */
  • 示例3:

    以3.1.4以下的内核版本为例,当前查询,包含表table02中字段idproduct,表table03中字段key的过滤条件不会下推。

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

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

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

语法

  • 内核版本为3.1.4及以上版本,请使用下方语句:

    set adb_config filter_not_pushdown_columns=[Schema1.tableName1:colName1|colName2;Schema2.tableName2:colName1|colName2]
  • 内核版本为3.1.4以下,请使用下面的语句:

    set adb_config no_index_columns=[tableName1.colName1;colName2,tableName2.colName1]
重要
  • 关闭特定字段的过滤条件下推能力既支持对同一个数据库中的表使用Hint,也支持对不同数据库中的表使用Hint。当3.1.4以下版本,跨库使用Hint时,需要保证两个库中的表名不同,否则Hint可能会影响到不需要生效的表。3.1.4及以上版本的Hint通过Schema.table区分不同表,对不同库中相同表名的表使用Hint时,不会影响查询结果。

  • 查询内核版本的方法,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。

示例

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

set adb_config filter_not_pushdown_columns=[test02.table02:id]