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

PolarDB:HAVING句からWHERE句に条件をプッシュダウンする

最終更新日:Dec 23, 2024

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句への条件プッシュダウンを有効にするかどうかを指定します。 有効な値:

  • having_cond_pushdown=ON (デフォルト): HAVING句からWHERE句への条件pushdownを有効にします。

  • having_cond_pushdown=OFF: HAVING句からWHERE句への条件プッシュダウンを無効にします。

loose_having_cond_pushdown_mode

グローバル

HAVING句からWHERE句への条件プッシュダウンを有効にするノードのタイプを指定します。 有効な値:

  • REPLICA_ON (デフォルト): 読み取り専用ノードでのみ、HAVING句からWHERE句への条件プッシュダウンを有効にします。

  • ON: すべてのノードでHAVING句からWHERE句への条件プッシュダウンを有効にします。

  • OFF: すべてのノードで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));