このトピックでは、演算子を使用して操作を実行する方法について説明します。
演算子
| 説明 | 演算子 |
| 操作をデータノードにプッシュダウンするために使用される演算子。 | LogicalView、LogicalModifyView、PhyTableOperation、およびIndexScan |
| テーブルの結合に使用される演算子。 | BKAJoin、NLJoin、HashJoin、SortMergeJoin、HashSemiJoin、SortMergeSemiJoin、およびMaterializedSemiJoin |
| データ行のソートに使用される演算子。 | MemSort、TopN、およびMergeSort |
| GROUP BY句で使用される集計演算子。 | HashAggとSortAgg |
| データの再配布または集計に使用される演算子。 | 交換と収集 |
| フィルター | フィルター |
| 列の選択に使用される演算子。 | プロジェクト |
| データセットのマージに使用される演算子。 | UnionAllおよびUnionDistinct |
| 出力行の最大数を指定するために使用される演算子。 limit演算子またはOffsetおよびFetch引数を使用して、出力行の最大数を指定できます。 | 制限 |
| ウィンドウ関数。 | オーバーウィンドウ |
実行するデータノードに操作をプッシュダウンするための演算子
LogicalView
LogicalView演算子は、データノードからデータを取得します。 LogicalView演算子は、他のデータベースサービスでサポートされているTableScanおよびIndexScan演算子に似ています。 LogicalView演算子を使用すると、TableScanおよびIndexScan演算子よりも多くの操作をストレージ層にプッシュダウンできます。 LogicalViewプランには、実行するストレージ層にプッシュされるSQL文と、データソースに関する情報が含まれます。 LogicalViewプランは、実行するストレージ層にプッシュされる操作のビューを提供します。 実行するストレージ層にプッシュされるステートメントには、Project演算子、Filter演算子、集計演算子、並べ替え演算子、結合演算子、サブクエリなどの演算子を含めることができます。 次のステートメントを実行して、実行プランのLogicalViewプランに含まれる情報を照会できます。
explain select * sbtest1からid > 1000;次の情報が返されます。
Gather(concurrent=true)
LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM 'sbtest1' WHERE ('id' > ?)") LogicalView演算子の引数:- tables: ステートメントが実行されるテーブルを指定します。 この例では、値は [データベースシャードのシリアル番号]. テーブル名_[テーブルシャードのシリアル番号] 形式です。 [000-127] は、シリアル番号が000から127の範囲のテーブルシャードを示します。
- shardCount: スキャンされるテーブルシャードの総数を指定します。 この例では、シリアル番号が000から127の範囲の128テーブルシャードがスキャンされます。
- sql: ストレージレイヤにプッシュされるSQLテンプレートを指定します。 PolarDB-XがSQLステートメントを実行すると、PolarDB-Xはテーブル名を物理テーブル名に置き換え、疑問符 (?) を実際の値に置き換えます。 詳細については、「実行プランの管理」をご参照ください。
LogicalModifyView
- 例1
について説明しますupdate sbtest1 set c='Hello, DRDS' where id > 1000;次の情報が返されます。
LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="UPDATE 'sbtest1' SET 'c' = ? どこ ('id' > ?)" - 例2
説明しますsbtest1からの削除id > 1000;次の情報が返されます。
LogicalModifyView(tables="[0000-0031].sbtest1_[000-127]" 、shardCount=128、sql="DELETE FROM 'sbtest1' WHERE ('id' > ?)")
PhyTableOperation
PhyTableOperation演算子は、物理テーブルシャードで操作を実行するために使用されます。
insert into sbtest1値 (1、1、'1' 、'1') 、(2、2、'2' 、'2') を説明します。次の情報が返されます。
PhyTableOperation(tables="SYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_001]", sql="INSERT INTO? ('id' 、'k' 、'c' 、'pad') VALUES(? 、? 、? 、?)"、params=" 'sbtest1_001 '、1,1、1,1 ")
PhyTableOperation(tables="SYSBENCH_CORONADB_1526954857179TGMMSYSBENCH_CORONADB_VGOC_0000_RDS.[sbtest1_002]", sql="INSERT INTO? ('id', 'k', 'c', 'pad') VALUES(?, ?, ?)", params=" 'sbtest1_002 ',2,2,2,2 ") この例では、INSERTステートメントを実行して2行のデータを挿入します。 PhyTableOperation演算は、データの各行を挿入するために実行される。 PhyTableOperation演算子の引数:- tables: 物理テーブルの名前を指定します。 この例では、PhyTableOperation操作ごとに1つの物理テーブルのみが指定されています。
- sql: SQLテンプレートを指定します。 SQLテンプレートでは、テーブル名と定数はパラメータ化され、疑問符 (?) に置き換えられます。 params引数は、テーブル名と定数を指定するために使用されます。
- params: テーブル名や定数など、SQLテンプレートに含まれる引数の値を指定します。
IndexScan
IndexScanは、データノードからデータを取得する演算子です。 IndexScan演算子の操作は、LogicalView演算子の操作と同様です。 IndexScanとLogicalViewの違いは、IndexScanはインデックステーブルをスキャンし、LogicalViewはベーステーブルをスキャンすることです。 次のステートメントを実行して、実行プランのIndexScanプランに含まれる情報を照会できます。
explain select * from sequence_one_base where integer_test=1;次の情報が返されます。
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
IndexScan(tables="DRDS_POLARX1_QATEST_APP_000000_GROUP.gsi_sequence_one_index_3a0A_01" 、sql="SELECT 'pk' 、'integer_test' 、'varchar_test' 、'char_test' 、'blob_test' 、'tinyint_1bit_test '、'smallint_test' 、'double_test' 、'_time '、'_test' 、'_test' 、' 、'_test' 、' 、'____、' 、'、' 、'、' 、'、' 、'____'timestamp_test' 、'year_test' 、'mediumtext_test' FROM 'gsi_dml_sequence_one_index_index' 'AS 'gsi_dml_sequence_one_index_index' WHERE ('integer_test' = ?)") sequence_one_baseテーブルにグローバルセカンダリインデックスが含まれておらず、integer_testがパーティションキーでない場合、sequence_one_baseテーブルのすべてのシャードがスキャンされます。 この例では、sequence_one_baseテーブルにはgsi_sequence_one_indexという名前のグローバルセカンダリインデックスがあり、インデックスはinteger_test列に作成されます。 integer_test=1は、gsi_sequence_one_indexインデックステーブルのシャードを指定する条件として使用されます。 この場合、システムは指定されたシャードのみをスキャンします。計算ノードまたはデータノードで実行できる演算子
UnionAllおよびUnionDistinct
UnionAll演算子は、UNIALL演算子に対応し、UnionDistinct演算子は、UNIUNDISTINCT演算子に対応する。 和演算子は、2つ以上の入力データを1つのデータにマージするために使用されます。 次のサンプルコードは、UnionDistinctプランの例を示しています。
explain select * From sbtest1 where id > 1000 union different select * From sbtest1 where id < 200;次の情報が返されます。
UnionDistinct (同時=true)
収集 (concurrent=true)
LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM 'sbtest1' WHERE ('id' > ?)")
収集 (concurrent=true)
LogicalView(tables="[0000-0031].sbtest1_[000-127]" 、shardCount=128、sql="SELECT * FROM 'sbtest1' WHERE ('id' < ?)") 収集
Gather演算子は、複数のデータセットを1つのデータセットにマージするために使用されます。 LogicalViewプランの説明に使用されている前述の例では、Gather演算子を使用して、指定されたテーブルシャードから取得したデータを1つのデータセットにマージします。 ほとんどの場合、Gather演算子はLogicalView演算子の前に表示され、指定されたテーブルシャードから取得したデータがマージされていることを示します。
交換
- SINGLETON: 複数のデータセットをマージします。 操作はGather演算子の操作と同じです。
- HASH_DISTRIBUTED: 指定された列に基づいて入力データを再分割します。 このメソッドは、結合演算子と集計演算子を含む実行プランで使用されます。
- BROADCAST_DISTRIBUTED: データのセットを複数のセットに分割し、各データのセットを異なる下流ノードにブロードキャストします。 このメソッドは、大規模並列処理 (MPP) の実行プランで使用されます。
MergeSort
MergeSortは、複数の順序付けられたデータストリームを1つの順序付けられたデータストリームにマージおよびソートするために使用されるマージソート演算子です。 次のサンプルコードは、MergeSortプランの例を示しています。
説明select * from sbtest1 where id > 1000 order by id limit 5,10;次の情報が返されます。
MergeSort(sort="id ASC", offset=?1, fetch=?2)
LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT * FROM 'sbtest1' WHERE ('id' > ?) ORDER BY 'id' LIMIT (?? + ?)") MergeSort演算子の引数:- sort: 実行されるソートとソート方法に基づいて列を指定します。 この例では、idは、ソートがid列に基づいて実行されることを指定し、ASCは、データストリームが昇順でソートされることを指定する。 DESCがソート方法として指定されている場合、データストリームは降順にソートされます。
- offset: ソート後のオフセット値を指定します。 この例では、値はパラメータ化される。 実際のオフセット値は5である。
- fetch: 返されるデータ行の最大数を指定します。 この例では、値もパラメータ化されています。 実際の値は10です。
プロジェクト
Project演算子は、入力データから列を選択するか、指定した関数または式を使用して指定した列にあるデータを計算し、結果を出力するために使用されます。 Project演算子には定数を含めることもできます。
explain select 'Hello, DRDS', 1 / 2, CURTIME();次の情報が返されます。
プロジェクト (Hello, DRDS="_UTF-16 'Hello, DRDS'", 1 / 2="1 / 2", CURTIME()="CURTIME()") プロジェクト演算子のプランには、指定された各列の名前、SQL文で指定された値、指定された値の計算に使用される関数または式を含めることができます。 フィルター
Filter演算子は、データをフィルタリングするために使用されます。 Filter演算子のプランには、データのフィルタリングに使用される条件が含まれます。 この演算子は、入力データをフィルタリングするために使用される。 このオペレータは、指定された条件を満たすデータを出力し、指定された条件を満たさないデータを破棄します。 次の例では、前の部分で説明した特定の演算子が使用されます。
explain select k, avg(id) avg_id from sbtest1ここでid > 1000 group by k having avg_id > 1300;次の情報が返されます。
フィルター (条件="avg_id > ?1")
プロジェクト (k="k", avg_id="sum_pushed_sum / sum_pushed_count")
SortAgg(group="k", sum_pushed_sum="SUM(pushed_sum)", sum_pushed_count="SUM(pushed_count)")
MergeSort(sort="k ASC")
LogicalView(tables="[0000-0031].sbtest1_[000-127]", shardCount=128, sql="SELECT 'k', SUM('id') AS 'pushed_sum', COUNT('id') AS 'pushed_count' FROM 'sbtest1' WHERE ('id'>) GROUP BY 'k' ORDER BY 'k'") この例では、WHERE id > 1000条件がLogicalView操作にプッシュされるため、WHERE id > 1000条件に基づいてデータをフィルタリングするフィルタ演算子は割り当てられません。 サンプルコードでは、LogicalViewプランでWHERE (id > ?) 条件を確認できます。