説明
V4.2.x系では、この変数はV4.2.5バージョンおよびV4.2.1 BP9バージョンから導入されました。
機能の概要
partition_index_dive_limitは、ストレージ層で行を推定する際にオプティマイザーが使用するパーティション数の上限を指定します。
権限要件
クエリ変数
グローバルレベル
sysテナントとすべてのユーザーテナントは
SHOW VARIABLESステートメント、またはSYS.TENANT_VIRTUAL_GLOBAL_VARIABLEビュー(Oracleモード)およびinformation_schema.GLOBAL_VARIABLESビュー(MySQLモード)を使用してグローバルシステム変数の値を確認できます。セッションレベル
sysテナントとすべてのユーザーテナントは
SHOW VARIABLESステートメント、またはSYS.TENANT_VIRTUAL_SESSION_VARIABLEビュー(Oracleモード)およびinformation_schema.SESSION_VARIABLESビュー(MySQLモード)を使用してセッションシステム変数の値を確認できます。
変数の変更
グローバル有効
- sysテナントはグローバルシステム変数の値を直接変更できます。
- MySQLユーザーテナントは
SUPERまたはALTER SYSTEM権限が必要です。 - Oracleユーザーテナントは
ALTER SYSTEM権限が必要です。
セッション有効
sysテナントとすべてのユーザーテナントは、自身のテナントに属するセッションシステム変数の値を直接変更できます。
プロパティの説明
プロパティ |
説明 |
|---|---|
| パラメータタイプ | Int |
| デフォルト値 | 10 |
| 値の範囲 | [0, INT64_MAX]
説明ここで:
|
| 適用範囲 |
|
| 変更は可能か | はい。SET または ALTER SESSION SET ステートメントを使用して変更できます。 |
使用方法
この変数を変更することで、オプティマイザーがストレージ層で行推定を行う際のパーティション数の制限を制御できます:
- パーティション数がこの変数より少ない場合、常にすべてのパーティションを選択してストレージ層で行推定を行います。
- パーティション数がこの変数以上の場合、ランダムに
partition_index_dive_limit個のパーティションを選択してストレージ層で行推定を行い、推定結果を同比率で拡大します。 - この変数が
0の場合、常にすべてのパーティションを選択してストレージ層で行推定を行います。 range_index_dive_limitとpartition_index_dive_limitがどちらも負の数値の場合、ストレージ層で行推定を行うポリシーはV4.2.5以前のバージョンにロールバックし、単一パーティションの10個の範囲内でのみストレージ層で行推定を行います。それを超える場合はサンプリングしません。
設定例
テーブルを作成し、データを挿入します。
obclient> CREATE TABLE t11(c1 int, c2 int, index i1(c2)) PARTITION BY range(c1) (partition p0 values less than(10), partition p1 values less than(20), partition p2 values less than(30)); Query OK, 0 rows affected (0.112 sec) obclient> INSERT INTO t11 SELECT 1,1 FROM table(generator(10)); Query OK, 10 rows affected (0.007 sec) Records: 10 Duplicates: 0 Warnings: 0 obclient> INSERT INTO t11 SELECT 11,11 FROM table(generator(20)); Query OK, 20 rows affected (0.003 sec) Records: 20 Duplicates: 0 Warnings: 0 obclient> INSERT INTO t11 SELECT 21,21 FROM table(generator(30)); Query OK, 30 rows affected (0.003 sec) Records: 30 Duplicates: 0 Warnings: 0実行計画を確認します。デフォルトのシナリオでは、10個のパーティションを超えない範囲でストレージ層での行推定が適用されます。
obclient [test]> EXPLAIN SELECT c1 FROM t11 WHERE c2 in (1,11,21); +---------------------------------------------------------------------------------------------------------------+ | Query Plan | +---------------------------------------------------------------------------------------------------------------+ | ============================================================= | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ------------------------------------------------------------- | | |0 |PX COORDINATOR | |60 |253 | | | |1 |└─EXCHANGE OUT DISTR |:EX10000|60 |234 | | | |2 | └─PX PARTITION ITERATOR| |60 |193 | | | |3 | └─TABLE RANGE SCAN |t11(i1) |60 |193 | | | ============================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | 1 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | dop=1 | | 2 - output([t11.c1]), filter(nil), rowset=256 | | force partition granule | | 3 - output([t11.c1]), filter(nil), rowset=256 | | access([t11.__pk_increment], [t11.c1]), partitions(p[0-2]) | | is_index_back=true, is_global_index=false, | | range_key([t11.c2], [t11.__pk_increment]), range(1,MIN ; 1,MAX), (11,MIN ; 11,MAX), (21,MIN ; 21,MAX), | | range_cond([t11.c2 IN (1, 11, 21)]) | +---------------------------------------------------------------------------------------------------------------+ 20 rows in set (0.007 sec)変数を変更し、ストレージ層での行推定を1つのパーティションのみに限定します。
obclient [test]> SET partition_index_dive_limit = 1; Query OK, 0 rows affected (0.000 sec)実行計画を確認すると、ストレージ層での行推定が1つのパーティションのみで行われ、推定結果が
10 * 3 = 30であることがわかります。obclient [test]> EXPLAIN SELECT c1 FROM t11 WHERE c2 in (1,11,21); +---------------------------------------------------------------------------------------------------------------+ | Query Plan | +---------------------------------------------------------------------------------------------------------------+ | ============================================================= | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ------------------------------------------------------------- | | |0 |PX COORDINATOR | |30 |148 | | | |1 |└─EXCHANGE OUT DISTR |:EX10000|30 |139 | | | |2 | └─PX PARTITION ITERATOR| |30 |118 | | | |3 | └─TABLE RANGE SCAN |t11(i1) |30 |118 | | | ============================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | 1 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | dop=1 | | 2 - output([t11.c1]), filter(nil), rowset=256 | | force partition granule | | 3 - output([t11.c1]), filter(nil), rowset=256 | | access([t11.__pk_increment], [t11.c1]), partitions(p[0-2]) | | is_index_back=true, is_global_index=false, | | range_key([t11.c2], [t11.__pk_increment]), range(1,MIN ; 1,MAX), (11,MIN ; 11,MAX), (21,MIN ; 21,MAX), | | range_cond([t11.c2 IN (1, 11, 21)]) | +---------------------------------------------------------------------------------------------------------------+ 20 rows in set (0.003 sec)