PolarDBを使用すると、SQLクエリのHAVING句からWHERE句に条件をプッシュダウンできます。 クエリのパフォーマンスを向上させるために、複雑なSQLクエリを変換して、以前のフィルタリングに適した条件をHAVING
句からWHERE
句にプッシュダウンできます。
サポートされているバージョン
クラスターは、次のいずれかのデータベースエンジンバージョンを実行します。 クラスターバージョンを表示する方法の詳細については、「エンジンバージョンの照会」をご参照ください。
リビジョンバージョンが8.0.1.1.42以降のMySQL 8.0.1。
リビジョンバージョンが8.0.2.2.10以降のMySQL 8.0.2。
制限事項
条件 (または条件の一部) が
GROUP BY
句で使用されているフィールド、またはグループ化されたフィールドと同じフィールドのみに依存する場合、条件をHAVING
句からWHERE
句にプッシュダウンできます。集計関数はプッシュダウンできません。
背景
HAVING
句は、グループ化された結果をフィルタリングするために多くの複雑なクエリで使用されます。 ほとんどの場合、HAVING
句の条件は、GROUP BY
操作の結果のグループ化されたデータに適用されます。 HAVING句では、以前のフィルタリングに適した条件をWHERE
句にプッシュダウンできます。 これにより、クエリの後の段階で処理されるデータの量が最小限に抑えられ、クエリのパフォーマンスと効率が大幅に向上します。
使用状況
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)
FROM t1
GROUP BY t1.a
HAVING (t1.a>2) AND (MAX(c)>12);
変換後のクエリ構文:
SELECT t1.a,MAX(t1.b)
FROM t1
WHERE (t1.a>2)
GROUP BY t1.a
HAVING (MAX(c)>12);
例 2:
SELECT t1.a,MAX(t1.b),t1.c
FROM t1
GROUP BY t1.a
HAVING ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));
変換後のクエリ構文:
SELECT t1.a,MAX(t1.b),t1.c
FROM t1
WHERE ((t1.a=t1.c) AND (t1.a>1)) OR (t1.a<3)
GROUP BY t1.a
HAVING ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));