TiFlash遅延マテリアライゼーション
注記:
TiFlash の遅延マテリアライゼーションは高速スキャンモードでは有効になりません。
TiFlash の遅延マテリアライゼーションは、OLAP シナリオにおけるクエリを高速化するための最適化手法です。システム変数tidb_opt_enable_late_materialization
使用して、 TiFlash の遅延マテリアライゼーションの有効化または無効化を制御できます。
- 無効にすると、フィルタ条件(
WHERE
句)を含むSELECT
ステートメントを処理するために、 TiFlash はクエリに必要な列からすべてのデータを読み取り、クエリ条件に基づいてデータをフィルタリングして集計します。 - 有効にすると、 TiFlash はフィルター条件の一部を TableScan オペレーターにプッシュダウンすることをサポートします。つまり、 TiFlash はまず TableScan オペレーターにプッシュダウンされたフィルター条件に関連する列データをスキャンし、条件を満たす行をフィルタリングした後、それらの行の残りの列データをスキャンしてさらに計算を行います。これにより、データ処理における IO スキャンと計算量が削減されます。
OLAPシナリオにおける特定のクエリのパフォーマンスを向上させるため、v7.1.0以降ではTiFlashの遅延マテリアライゼーション機能がデフォルトで有効化されています。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はフィルタリングされた行から列b
とc
読み取ります。
TiFlash の遅延マテリアライゼーションを有効または無効にする
デフォルトでは、システム変数tidb_opt_enable_late_materialization
セッションレベルとグローバルレベルの両方でON
設定されており、これはTiFlash の遅延マテリアライゼーション機能が有効になっていることを意味します。対応する変数情報を表示するには、次のステートメントを使用します。
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 の遅延マテリアライゼーションを無効にするには、次のステートメントを使用します。
SET SESSION tidb_opt_enable_late_materialization=OFF;グローバル レベルでTiFlash の遅延マテリアライゼーションを無効にするには、次のステートメントを使用します。
SET GLOBAL tidb_opt_enable_late_materialization=OFF;この設定後、新しいセッションでは、セッション レベルとグローバル レベルの両方で
tidb_opt_enable_late_materialization
変数がデフォルトで有効になります。
TiFlash の遅延マテリアライゼーションを有効にするには、次のステートメントを使用します。
SET SESSION tidb_opt_enable_late_materialization=ON;
SET GLOBAL tidb_opt_enable_late_materialization=ON;
実施メカニズム
フィルター条件が TableScan オペレーターにプッシュダウンされると、TableScan オペレーターの実行プロセスには主に次の手順が含まれます。
- 3 つの列
<handle, del_mark, version>
読み取り、マルチバージョン同時実行制御 (MVCC) フィルタリングを実行し、MVCC ビットマップを生成します。 - フィルター条件に関連する列を読み取り、条件を満たす行をフィルターして、フィルター ビットマップを生成します。
- MVCC ビットマップとフィルター ビットマップの間で
AND
演算を実行して、最終ビットマップを生成します。 - 最終ビットマップに従って、残りの列の対応する行を読み取ります。
- 手順 2 と 4 で読み取ったデータを結合し、結果を返します。