📣

TiDB Cloud Serverless 现已更名为
Starter
!此页面由 AI 自动翻译,英文原文请见
此处。

TiFlash Late Materialization

TiFlash late materialization 是一种优化方法,用于在 OLAP 场景中加速查询。你可以使用 tidb_opt_enable_late_materialization 系统变量来控制是否启用或禁用 TiFlash late materialization。

  • 当其被禁用时,为了处理带有过滤条件(WHERE 子句)的 SELECT 语句,TiFlash 会读取所有查询所需列的数据,然后根据查询条件进行过滤和聚合。
  • 当其被启用时,TiFlash 支持将部分过滤条件下推到 TableScan 操作符。也就是说,TiFlash 首先扫描与过滤条件相关的列数据(被下推到 TableScan 的过滤条件),过滤出满足条件的行,然后再扫描这些行的其他列数据进行后续计算,从而减少 IO 扫描和数据处理的计算量。

为了提升某些查询在 OLAP 场景中的性能,从 v7.1.0 版本开始,TiFlash late materialization 功能默认开启。TiDB 优化器可以根据统计信息和过滤条件判断哪些过滤条件需要下推,并优先下推过滤率高的条件。关于详细的算法细节,参见 RFC 文档

例如:

EXPLAIN SELECT a, b, c FROM t1 WHERE a < 1;
+-------------------------+----------+--------------+---------------+-------------------------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+--------------+---------------+-------------------------------------------------------+ | TableReader_12 | 12288.00 | root | | MppVersion: 1, data:ExchangeSender_11 | | └─ExchangeSender_11 | 12288.00 | mpp[tiflash] | | ExchangeType: PassThrough | | └─TableFullScan_9 | 12288.00 | mpp[tiflash] | table:t1 | pushed down filter:lt(test.t1.a, 1), keep order:false | +-------------------------+----------+--------------+---------------+-------------------------------------------------------+

在此示例中,过滤条件 a < 1 被下推到 TableScan 操作符。TiFlash 首先读取列 a 的所有数据,然后过滤出满足 a < 1 条件的行。接着,TiFlash 读取这些行的列 bc

Enable or disable TiFlash late materialization

默认情况下,tidb_opt_enable_late_materialization 系统变量在会话和全局层面均为 ON,意味着 TiFlash late materialization 功能已启用。你可以使用以下语句查看对应的变量信息:

SHOW VARIABLES LIKE 'tidb_opt_enable_late_materialization';
+--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | tidb_opt_enable_late_materialization | ON | +--------------------------------------+-------+
SHOW GLOBAL VARIABLES LIKE 'tidb_opt_enable_late_materialization';
+--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | tidb_opt_enable_late_materialization | ON | +--------------------------------------+-------+

你可以在会话层面或全局层面修改 tidb_opt_enable_late_materialization 变量。

  • 若要在当前会话中禁用 TiFlash late materialization,使用以下语句:

    SET SESSION tidb_opt_enable_late_materialization=OFF;
  • 若要在全局层面禁用 TiFlash late materialization,使用以下语句:

    SET GLOBAL tidb_opt_enable_late_materialization=OFF;

    设置后,tidb_opt_enable_late_materialization 变量在新会话中默认会启用。

若要启用 TiFlash late materialization,使用以下语句:

SET SESSION tidb_opt_enable_late_materialization=ON;
SET GLOBAL tidb_opt_enable_late_materialization=ON;

Implementation mechanism

当过滤条件被下推到 TableScan 操作符时,TableScan 的执行过程主要包括以下步骤:

  1. 读取 <handle, del_mark, version> 三个列,进行多版本并发控制(MVCC)过滤,并生成 MVCC Bitmap。
  2. 读取与过滤条件相关的列,过滤出满足条件的行,并生成 Filter Bitmap。
  3. 对 MVCC Bitmap 和 Filter Bitmap 进行 AND 操作,生成 Final Bitmap。
  4. 根据 Final Bitmap 读取剩余列的对应行数据。
  5. 将步骤 2 和步骤 4 中读取的数据合并,返回结果。

文档内容是否有帮助?