プッシュダウンは、SQL書き換えの重要な最適化です。 シャーディング情報は、実行計画を最適化するために使用されます。 このようにして、オペレータは、事前にデータをフィルタリングし、ネットワーク伝送量を削減し、並列コンピューティングを実装するなどの目的を達成するために、可能な限りプッシュダウンすることができます。
背景情報
PolarDB-X 1.0のSQL文を最適化する基本原則に基づいて、可能な限り多くの計算PolarDB-X 1.0をストレージレイヤーMySQLにプッシュダウンして実行できます。
プッシュダウンできる計算は次のとおりです。
- JOIN
WHEREまたはHAVINGの条件などのフィルター条件COUNTやGROUP 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の名前。

制限とソートpushdown
SQL文の実行プランを生成する次のプロセスでは、ソート演算子と制限演算子がLogicalView演算子に連続的にプッシュされます。 ソートおよび制限プッシュダウンは、事前のデータのフィルタリング、ネットワーク伝送量の削減、並列実行の実装、PolarDB-X 1.0のメモリ使用量の削減などの効果を実現できます。PolarDB-X 1.0
> explain optimizer select * from customer order by c_custkey limit 10 
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の場合:

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

プッシュダウンに参加する
JOINプッシュダウンには、次の条件を満たす必要があります。
- テーブルt1およびt2のシャーディング方法は一貫しており、データベースシャーディングキー、テーブルシャーディングキー、シャーディング関数、およびシャーディングの数を含む。
- JOIN条件には、テーブルt1とt2のシャードキー間の等価関係が含まれます。
さらに、テーブルとブロードキャストテーブルとの間のJOINは、常にプッシュダウンされ得る。
> optimizer select * from t1, t2 where t1.id = t2.id;SQL文の実行計画を生成する次のプロセスでは、JOIN演算子がLogicalView演算子にプッシュされます。 JOINプッシュダウンは、コンピューティングをストレージに近づけ、並列実行を高速化できます。

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); 