OracleモードのOceanBaseデータベースでは、分散DMLヒントを使用して、DML操作が分散方式で実行されるかどうかを制御できます。以下の2つの重要な概念を区別することにご注意ください:
- 分散DML:複数のノード間で実行されるDML操作を指し、単一のノード上でローカルまたはパーティション単位で実行される非分散DML操作とは本質的に異なります。
- パラレルDML:単一のノード内で複数のスレッドが並行して1つのDML操作を実行する場合を強調します。
さらに、このようなヒントは実行計画を固定するために使用できますが、ユーザーによる使用は推奨されません。一般的にはOUTLINE DATAでのみ有効にすることをお勧めします。
| ヒント名 | 説明 |
|---|---|
USE_DISTRIBUTED_DML |
分散DML操作を有効にします。その逆操作はNO_USE_DISTRIBUTED_DMLです。 |
NO_USE_DISTRIBUTED_DML |
分散DML操作を無効にします。その逆操作はUSE_DISTRIBUTED_DMLです。 |
USE_DISTRIBUTED_DML ヒント
USE_DISTRIBUTED_DML ヒントは、分散DML操作を有効にします。このヒントを有効にすると、DML操作は分散実行されるようになります。その逆の操作は NO_USE_DISTRIBUTED_DML ヒントです。
構文
/*+ USE_DISTRIBUTED_DML [ ( [ @ qb_name ] ) ] */
例
-- ハッシュパーティションを使用して、10個のパーティションを含むtp1という名前のテーブルを作成します。
CREATE TABLE tp1(c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) PARTITIONS 10;
-- USE_DISTRIBUTED_DMLヒントを使用して、tp1テーブルを更新し、c1列の値が4未満の場合にc2列の値を4に設定します。
-- この更新操作は分散実行されます。
EXPLAIN BASIC UPDATE /*+ USE_DISTRIBUTED_DML */ tp1 SET c2 = 4 WHERE c1 < 4;
+--------------------------------------------------------------------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------------------------------------------------------------------+
| ========================================= |
| |ID|OPERATOR |NAME | |
| ----------------------------------------- |
| |0 |DISTRIBUTED UPDATE | | |
| |1 |└─PX COORDINATOR | | |
| |2 | └─EXCHANGE OUT DISTR |:EX10000| |
| |3 | └─PX PARTITION ITERATOR| | |
| |4 | └─TABLE FULL SCAN |TP1 | |
| ========================================= |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output(nil), filter(nil) |
| table_columns([{TP1: ({TP1: (TP1.__pk_increment, TP1.C1, TP1.C2, TP1.C3)})}]), |
| update([TP1.C2=column_conv(NUMBER,PS:(-1,0),NULL,cast(4, NUMBER(-1, -85)))]) |
| 1 - output([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| 2 - output([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| dop=1 |
| 3 - output([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), filter(nil), rowset=16 |
| force partition granule |
| 4 - output([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), filter([TP1.C1 < cast(4, NUMBER(-1, -85))]), rowset=16 |
| access([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), partitions(p[0-9]) |
| is_index_back=false, is_global_index=false, filter_before_indexback[false], |
| range_key([TP1.__pk_increment]), range(MIN ; MAX)always true |
+--------------------------------------------------------------------------------------------------------------------------+
23 rows in set
NO_USE_DISTRIBUTED_DML ヒント
NO_USE_DISTRIBUTED_DML ヒントは、DML操作における分散実行方式を禁止します。その逆の操作は USE_DISTRIBUTED_DML ヒントです。
構文
/*+ NO_USE_DISTRIBUTED_DML [ ( [ @ qb_name ] ) ] */
例
-- ハッシュパーティションを使用したtp1というテーブルを作成し、10個のパーティションを含めます
CREATE TABLE tp1(c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) PARTITIONS 10;
-- NO_USE_DISTRIBUTED_DMLヒントを使用して、更新操作が分散実行ではなく単一ノード上でローカル実行されるように制限します
-- この更新操作は非分散実行となります
EXPLAIN BASIC UPDATE /*+ NO_USE_DISTRIBUTED_DML */ tp1 SET c2 = 4 WHERE c1 < 4;
+--------------------------------------------------------------------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------------------------------------------------------------------+
| ======================================= |
| |ID|OPERATOR |NAME | |
| --------------------------------------- |
| |0 |PX COORDINATOR | | |
| |1 |└─EXCHANGE OUT DISTR |:EX10000| |
| |2 | └─PX PARTITION ITERATOR| | |
| |3 | └─UPDATE | | |
| |4 | └─TABLE FULL SCAN |TP1 | |
| ======================================= |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output(nil), filter(nil), rowset=16 |
| 1 - output(nil), filter(nil), rowset=16 |
| dop=1 |
| 2 - output(nil), filter(nil), rowset=16 |
| partition wise, force partition granule |
| 3 - output(nil), filter(nil) |
| table_columns([{TP1: ({TP1: (TP1.__pk_increment, TP1.C1, TP1.C2, TP1.C3)})}]), |
| update([TP1.C2=column_conv(NUMBER,PS:(-1,0),NULL,cast(4, NUMBER(-1, -85)))]) |
| 4 - output([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), filter([TP1.C1 < cast(4, NUMBER(-1, -85))]), rowset=16 |
| access([TP1.__pk_increment], [TP1.C1], [TP1.C2], [TP1.C3]), partitions(p[0-9]) |
| is_index_back=false, is_global_index=false, filter_before_indexback[false], |
| range_key([TP1.__pk_increment]), range(MIN ; MAX)always true |
+--------------------------------------------------------------------------------------------------------------------------+
23 rows in set