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

PolarDB:SQLの書き換えとプッシュダウン

最終更新日:Jun 03, 2024

プッシュダウンは、SQL書き換えの重要な最適化です。 シャーディング情報は、実行計画を最適化するために使用されます。 このようにして、オペレータは、事前にデータをフィルタリングし、ネットワーク伝送量を削減し、並列コンピューティングを実装するなどの目的を達成するために、可能な限りプッシュダウンすることができます。

背景情報

PolarDB-X 1.0のSQL文を最適化する基本原則に基づいて、可能な限り多くの計算PolarDB-X 1.0をストレージレイヤーMySQLにプッシュダウンして実行できます。

プッシュダウンできる計算は次のとおりです。

  • JOIN
  • WHEREまたはHAVINGの条件などのフィルター条件
  • COUNTGROUP BYなどのコンピューティング
  • ORDER BYなどの並べ替え
  • DISTINCTなどの重複の削除
  • NOW() 関数などの関数計算
  • サブクエリ
説明 explain optimizer + SQLを使用して、sql書き換えの詳細なプロセスを確認できます。

プロジェクトとフィルターpushdown

SQL文の実行計画を生成する次のプロセスでは、Filter演算子とProject演算子がLogicalView演算子に連続してプッシュされます。

フィルタとプロジェクトのプッシュダウンは、事前にデータをフィルタリングしたり、ネットワーク伝送量を減らすなどの効果を実現できます。

> 説明オプティマイザselect c_custkey,c_name from customer where c_custkey = 1;

c_custkey: customerのシャードキー。 c_name: customerの名前。

Project and Filter pushdown

制限とソートpushdown

SQL文の実行プランを生成する次のプロセスでは、ソート演算子と制限演算子がLogicalView演算子に連続的にプッシュされます。 ソートおよび制限プッシュダウンは、事前のデータのフィルタリング、ネットワーク伝送量の削減、並列実行の実装、PolarDB-X 1.0のメモリ使用量の削減などの効果を実現できます。PolarDB-X 1.0

> explain optimizer select * from customer order by c_custkey limit 10
Limit and Sort pushdown

Aggプッシュダウン

SQL文の実行計画を生成する次のプロセスでは、Agg演算子がLogicalView演算子にプッシュされます。

Aggプッシュダウンは、事前にデータをフィルタリングし、ネットワーク送信量を削減し、並列実行を実装し、PolarDB-X 1.0のメモリ使用量を削減するなどの効果を実現できます。PolarDB-X 1.0

> explain optimizer select count(*) from customer group by c_nationkey;

シャードキーがc_nationkeyの場合:

Agg pushdown for which the shard key is c_nationkey

シャードキーがc_nationkeyでない場合:

Agg pushdown for which the shard key is not c_nationkey

プッシュダウンに参加する

JOINプッシュダウンには、次の条件を満たす必要があります。

  • テーブルt1およびt2のシャーディング方法は一貫しており、データベースシャーディングキー、テーブルシャーディングキー、シャーディング関数、およびシャーディングの数を含む。
  • JOIN条件には、テーブルt1とt2のシャードキー間の等価関係が含まれます。

さらに、テーブルとブロードキャストテーブルとの間のJOINは、常にプッシュダウンされ得る。

> optimizer select * from t1, t2 where t1.id = t2.id;

SQL文の実行計画を生成する次のプロセスでは、JOIN演算子がLogicalView演算子にプッシュされます。 JOINプッシュダウンは、コンピューティングをストレージに近づけ、並列実行を高速化できます。

JOIN pushdown

JoinClustering

JOIN操作が複数のテーブルで実行される場合、PolarDB-X 1.0は結合クラスタリングの最適化テクノロジを使用してjoin操作を再ソートし、プッシュダウン可能なJOIN操作を隣接する位置に配置します。 このようにして、JOIN操作を期待どおりにプッシュダウンすることができます。 以下の例が提供される。

元のJOIN順序がt2、t1、およびl2であると仮定する。 JOIN操作が再ソートされた後でも、t2およびl2のJOIN操作はLogicalViewにプッシュダウンできます。

> t2.id = t1.id = l2.idでl2を結合するt2からt2.idを選択して説明します。プロジェクト (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'") 

サブクエリのプッシュダウン

SQL文の実行プランを生成する次のプロセスでは、サブクエリがLogicalView演算子にプッシュされます。

サブクエリプッシュダウンは、コンピューティングをストレージに近づけ、並列実行を高速化できます。

  • サブクエリは、最初にSemi JoinまたはAnti Joinに変換されます。
  • その後、JOINプッシュダウンの前のセクションで説明した条件が満たされると、[セミ結合] または [アンチ結合][LogicalView] に押し下げられます。
  • プッシュダウンされたSemi JoinまたはAnti Joinがサブクエリに復元されます。
explainオプティマイザーselect * from t1 where id in (select id from t2);
Subquery pushdown