説明
- V4.3.x系では、このビューはV4.3.3バージョンから導入されました。
- V4.2.x系では、このビューはV4.2.4バージョンから導入されました。
機能の概要
cardinality_estimation_modelは、オプティマイザーが基数推定を行う際に使用する相関仮説を設定します。
注意
このオプションを本番環境で使用する前に、十分なテストを行ってください。
権限要件
クエリ変数
グローバルレベル
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テナントとすべてのユーザーテナントは、自身のテナントのセッションシステム変数の値を直接変更できます。
プロパティの説明
| プロパティ | 説明 |
|---|---|
| パラメータタイプ | Enum |
| デフォルト値 | PARTIAL |
| 値の範囲 |
説明ほとんどのシナリオでは、3種類の相関性の推定結果は順に大きくなります:INDEPENDENT < PARTIAL < FULL。 |
| 適用範囲 |
|
| 変更は可能か | はい。SET ステートメントを使用して変更できます。 |
設定例
3つの相関性仮説の下で、t1に対してベーステーブル述語によるフィルタリング後の結果に対する行数の推定値はそれぞれ 10, 31, 98 となります。
テーブル
t1を作成します。obclient [test]> create table t1(c1 int, c2 int); Query OK, 0 rows affected (0.103 sec)テーブル
t1にデータを挿入します。obclient [test]> insert into t1 select row_number() over () % 10, row_number() over () % 100 from table(generator(10000)); Query OK, 10000 rows affected (0.077 sec) Records: 10000 Duplicates: 0 Warnings: 0テーブル
t1を分析します。obclient [test]> analyze table t1; Query OK, 0 rows affected (0.073 sec)相関性仮説を
INDEPENDENTに設定し、基数推定を実行します。obclient [test]> set cardinality_estimation_model = 'independent'; Query OK, 0 rows affected (0.001 sec)基数推定の結果を照会します。
obclient [test]> explain select * from t1 where c1 = 1 and c2 = 1;クエリ結果は次のとおりです:
+------------------------------------------------------------------------------------------+ | Query Plan | +------------------------------------------------------------------------------------------+ | =============================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ----------------------------------------------- | | |0 |TABLE FULL SCAN|t1 |10 |734 | | | =============================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1], [t1.c1 = 1]), rowset=16 | | access([t1.c1], [t1.c2]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false,false], | | range_key([t1.__pk_increment]), range(MIN ; MAX)always true | +------------------------------------------------------------------------------------------+ 11 rows in set (0.011 sec)相関性仮説を
PARTIALに設定し、基数推定を実行します。obclient [test]> set cardinality_estimation_model = 'partial'; Query OK, 0 rows affected (0.001 sec)基数推定の結果を照会します。
obclient [test]> explain select * from t1 where c1 = 1 and c2 = 1;クエリ結果は次のとおりです:
+------------------------------------------------------------------------------------------+ | Query Plan | +------------------------------------------------------------------------------------------+ | =============================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ----------------------------------------------- | | |0 |TABLE FULL SCAN|t1 |31 |735 | | | =============================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1], [t1.c1 = 1]), rowset=256 | | access([t1.c1], [t1.c2]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false,false], | | range_key([t1.__pk_increment]), range(MIN ; MAX)always true | +------------------------------------------------------------------------------------------+ 11 rows in set (0.004 sec)相関性仮説を
FULLに設定し、基数推定を実行します。obclient [test]> set cardinality_estimation_model = 'full'; Query OK, 0 rows affected (0.000 sec)基数推定の結果を照会します。
obclient [test]> explain select * from t1 where c1 = 1 and c2 = 1;クエリ結果は次のとおりです:
+------------------------------------------------------------------------------------------+ | Query Plan | +------------------------------------------------------------------------------------------+ | =============================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ----------------------------------------------- | | |0 |TABLE FULL SCAN|t1 |98 |738 | | | =============================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1], [t1.c1 = 1]), rowset=256 | | access([t1.c1], [t1.c2]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false,false], | | range_key([t1.__pk_increment]), range(MIN ; MAX)always true | +------------------------------------------------------------------------------------------+ 11 rows in set (0.003 sec)