すべてのプロダクト
Search
ドキュメントセンター

PolarDB:クエリのプッシュダウンと書き換え

最終更新日:May 27, 2024

PolarDB-Xは、実行するストレージ層に物理SQL文をプッシュダウンできます。 これはクエリ書き換えの最適化手法です。 PolarDB-Xによって提供される自動分割機能は、ストレージ層に操作をプッシュダウンするための実行計画を最適化するために使用されます。 クエリに含まれる特定の操作が実行されるストレージ層にプッシュダウンされると、クエリは最適化されます。 このようにして、クエリされたデータはストレージレイヤでフィルタリングされ、データ送信トラフィックが削減され、操作が並列に実行されます。

背景

PolarDB-Xは、クエリ最適化の基本原則に基づいて、特定の操作をストレージ層にプッシュダウンします。 次の操作をストレージレイヤーにプッシュできます。

  • 結合操作。

  • WHEREHAVINGなどの演算子を使用して指定されたフィルター操作。

  • COUNTGROUP byなどの演算子を使用して指定された演算を計算します。

  • ORDER byなどの演算子を使用して指定されたソート操作。

  • DISTINCTなどの演算子を使用して指定される重複排除演算。

  • NOW() などの関数を使用して実行される操作。

  • サブクエリ。

EXPLAIN OPTIMIZER <SQLステートメント> を使用して、SQLステートメントのクエリ書き換えプロセスをクエリできます。

プロジェクト操作とフィルター操作を押し下げる

SQL文の実行計画を生成するプロセスの例を次に示します。 フィルター操作とプロジェクト操作は、LogicalViewオペレーターにプッシュされます。 フィルター操作とプロジェクト操作が実行するストレージ層にプッシュダウンされると、クエリが最適化されます。 このようにして、照会されたデータは記憶層でフィルタリングされ、データ伝送トラフィックが低減される。

EXPLAIN OPTIMIZER select c_custkey,c_name from customer where c_custkey = 1;

c_custkeyはテーブルのパーティションキーです。 456789

制限操作とソート操作を押し下げる

SQL文の実行計画を生成するプロセスの例を次に示します。 ソート操作と制限操作は、LogicalView演算子にプッシュダウンされます。 ソート操作と制限操作が実行されるストレージ層にプッシュダウンされると、クエリが最適化されます。 このようにして、クエリされたデータはストレージレイヤでフィルタリングされ、データ送信トラフィックが削減され、操作が並列に実行され、PolarDB-Xデータベースのメモリ使用量が削減されます。

EXPLAIN OPTIMIZER select * from customer order by c_name limit 10

Push down limit operations and sort operations

集計操作をプッシュダウンする

SQL文の実行計画を生成するプロセスの例を次に示します。 集計操作は、LogicalView演算子にプッシュダウンされます。

集計操作が実行されるストレージ層にプッシュダウンされると、クエリが最適化されます。 このようにして、クエリされたデータはストレージレイヤでフィルタリングされ、データ送信トラフィックが削減され、クエリに含まれる操作が並列に実行され、PolarDB-Xデータベースのメモリ使用量が削減されます。

EXPLAIN OPTIMIZER select count(*) from customer group by c_nationkey;

次の図は、c_nationkeyがテーブルのパーティションキーである場合のSQL文の実行プランの生成方法を示しています。XXX.png次の図は、c_nationkeyがテーブルのパーティションキーでない場合に、SQL文の実行プランが生成される方法を示しています。456789

JoinClustering

クエリされたデータを複数のテーブルを結合して取得する必要があることをSQL文で指定すると、PolarDB-XはJoinClustering演算子を使用して結合操作を再ソートし、ストレージレイヤにプッシュできるjoin句を隣接する位置に配置します。 このようにして、結合操作を期待通りに押し下げることができる。 次の例は、3つのテーブルを結合する方法を示しています。

この例では、元の結合順序は、システムがt2テーブルとt1テーブルを結合し、次にt1テーブルとl2テーブルを結合することです。 JoinClustering演算子が結合演算を再ソートした後、t2およびl2テーブルに対して実行される結合演算は、LogicalView演算子にプッシュダウンされます。

EXPLAINはt2からt2.idを選択し、t2.id = t1.id = l2.idでl2を結合します。プロジェクト (id="id")
  HashJoin(condition="id = id AND id = id0", type="inner")
    収集 (concurrent=true)
      LogicalView(tables="t2_[0-3],l2_[0-3]", shardCount=4, sql="SELECT 't2 '.'id', 'l2'.'id' AS 'id0' FROM 't2' AS 't2' AS 't2' INNER JOIN 'l2' AS 'l2'. 'ON ('t2'. ''id') ''''''2id'. 'in') '''HE2'. '( ')
    収集 (concurrent=true)
      LogicalView(tables="t1", shardCount=2, sql="SELECT 'id' FROM 't1' AS 't1'") 

結合操作をプッシュダウンする

結合操作をプッシュダウンする場合は、次の条件を満たす必要があります。

  • 結合される2つのテーブルのシャーディング戦略は一貫している必要があります。 シャーディング戦略は、データベースのシャーディングキー、テーブルシャーディングキー、シャーディング関数、およびシャードの数を指定します。

  • 結合条件では、2つのテーブルに指定されるシャードキー値が一致している必要があります。

ブロードキャストテーブルと別のタイプのテーブルとを結合するために使用される結合操作は、実行されるストレージレイヤにプッシュダウンされます。

EXPLAIN OPTIMIZER select * from t1, t2 where t1.id = t2.id;

SQL文の実行計画を生成するプロセスの例を次に示します。 結合操作はLogicalView演算子にプッシュダウンされます。 ジョイン操作が実行されるストレージレイヤにプッシュダウンされると、クエリは並列に実行されることができ、クエリ効率が加速される。 456789

サブクエリをプッシュダウンする

SQL文の実行計画を生成するプロセスの例を次に示します。 SQL文に含まれるサブクエリ文は、LogicalView演算子にプッシュされます。 サブクエリステートメントをストレージ層にプッシュダウンして実行すると、クエリを並列に実行でき、クエリの効率が向上します。

  1. システムは、サブクエリをSemiJoinまたはAntiJoin操作に変換します。

  2. 「結合操作の押し下げ」セクションに記載されている条件が満たされると、SemiJoinまたはAntiJoin操作がLogicalView演算子に押し下げられます。

  3. ストレージレイヤーでは、SemiJoinまたはAntiJoinがサブクエリに変換されます。

EXPLAIN OPTIMIZER select * from t1 where id in (select id from t2);

456789