PolarDBを使用すると、SQLクエリのHAVING句からWHERE句に条件をプッシュダウンできます。 クエリのパフォーマンスを向上させるために、複雑なSQLクエリを変換して、以前のフィルタリングに適した条件をHAVING
句からWHERE
句にプッシュダウンできます。
前提条件
クラスターは、リビジョンバージョンが8.0.2.2.10以降のPolarDB for MySQL 8.0を実行します。 クラスターのバージョンを照会する方法については、「エンジンバージョン」トピックの「エンジンバージョンの照会」を参照してください。
制限事項
条件 (または条件の一部) が
GROUP BY
句で使用されているフィールド、またはグループ化されたフィールドと同じフィールドのみに依存する場合、条件をHAVING
句からWHERE
句にプッシュダウンできます。集計関数はプッシュダウンできません。
背景
HAVING
句は、グループ化された結果をフィルタリングするために多くの複雑なクエリで使用されます。 ほとんどの場合、HAVING
句の条件は、GROUP BY
操作の結果のグループ化されたデータに適用されます。 HAVING句では、以前のフィルタリングに適した条件をWHERE
句にプッシュダウンできます。 これにより、クエリの後の段階で処理されるデータの量が最小限に抑えられ、クエリのパフォーマンスと効率が大幅に向上します。
Usage
loose_polar_optimizer_switch
パラメーターを使用して、HAVING
句からWHERE
句への条件プッシュダウンを有効にできます。 loose_having_cond_pushdown_modeパラメーターを使用して、機能を有効にするノードを指定できます。 パラメーター設定については、「クラスターとノードパラメーターの設定」をご参照ください。
Parameters
パラメーター | レベル | 説明 |
loose_polar_optimizer_switch | グローバルとセッション | HAVING句からWHERE句への条件プッシュダウンを有効にするかどうかを指定します。 有効な値:
|
loose_having_cond_pushdown_mode | グローバル | HAVING句からWHERE句への条件プッシュダウンを有効にするノードのタイプを指定します。 有効な値:
|
例
HAVING
句からWHERE
句に条件をプッシュダウンします。
例 1:
SELECT t1.a,MAX(t1.b)
t1から
グループBY t1.a
HAVING (t1.a>2) および (MAX(c)>12);
変換後のクエリ構文:
SELECT t1.a,MAX(t1.b)
t1から
どこ (t1.a>2)
グループBY t1.a
持っている (MAX(c)>12);
例 2:
SELECT t1.a,MAX(t1.b),t1.c
t1から
グループBY t1.a
持っている ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));
変換後のクエリ構文:
SELECT t1.a,MAX(t1.b),t1.c
t1から
WHERE ((t1.a=t1.c) AND (t1.a>1)) OR (t1.a<3)
グループBY t1.a
持っている ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));