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

AnalyticDB:WITH

最終更新日:Jun 11, 2024

SELECTステートメントを使用する場合、WITH句を使用して共通テーブル式 (CTE) を作成できます。 CTEは、SELECTステートメント内で参照できる一時的な結果セットです。 CTEを使用すると、ネストされたクエリをフラット化したり、サブクエリを簡素化できます。 これにより、サブクエリはSELECTステートメントで1回だけ実行され、クエリのパフォーマンスが向上します。 このトピックでは、SELECTステートメントでWITH句を使用する方法について説明します。

使用上の注意

  • CTEが発生した場合に、SQL文またはその他のCTEを指定できます。 クエリで指定できるWITH句は1つだけです。 複数のCTEをコンマ (,) で区切る必要があります。 そうでなければ、CTEは無効である。

  • ページングはCTEでサポートされていません。

WITHの使い方

  • SELECTの代替ステートメントでWITHを使用

    SELECT a, b
    FROM (SELECT a, MAX(b) AS b FROM t GROUP BY a) AS x; 
    WITH x AS (SELECT a, MAX(b) AS b FROM t GROUP BY a)
    SELECT a, bからx; 
  • WITHを使用して複数のサブクエリを含める

    WITH
    t1 AS (SELECT a、MAX(b) AS b FROM x GROUP BY a) 、t2 AS (SELECT a、AVG(d) AS d FROM y GROUP BY a)
    SELECT t1 *, t2 *
    からt1 JOIN t2 ON t1.a = t2.a; 
  • 同じWITH句のサブクエリの後にある他のサブクエリのサブクエリを参照します

    WITH
    x AS (tから選択) 、y AS (SELECT a AS b FROM x),
    z AS (yからb AS cを選択)
    cをzから選択します。

CTE実行の最適化

CTE実行最適化機能は、V3.1.9.3以降のAnalyticDB for MySQLクラスターでサポートされています。 デフォルトで、この機能は無効化されています。 この機能を有効にするには、cte_execution_modeパラメーターを指定します。 この機能を有効にした後、CTEサブクエリを複数回参照する場合、サブクエリを1回だけ実行することで、特定のクエリのパフォーマンスを向上させることができます。

重要

CTE実行最適化機能は、特定のクエリのパフォーマンスを低下させる可能性があります。 クエリのパフォーマンスが大幅に低下した場合は、この機能を無効にすることを推奨します。

CTE実行最適化の有効化

  • 特定のクエリに対するCTE実行最適化の有効化

    特定のクエリ文の前にヒントを追加して、クエリのCTE実行最適化を有効にします。 組み込みデータセットの例:

    /* cte_execution_mode=shared * /
    共有AS (SELECT L_ORDERKEY、L_SUPPKEY FROM ADB_SampleData_TPCH_10GB.lineitem JOIN ADB_SampleData_TPCH_10GB.orders WHERE L_ORDERKEY = O_ORDERKEY)
    SELECT * FROM shared s1, shared s2 WHERE s1.L_ ORDERKEY = s2.L_ SUPPKEY; 
  • すべてのクエリのCTE実行最適化の有効化

    SETステートメントを実行して、すべてのクエリに対してCTE実行最適化を有効にします。 例:

    SET adb_config cte_execution_mode=shared;

CTE実行最適化の無効化

  • 特定のクエリに対するCTE実行最適化の無効化

    特定のクエリ文の前にヒントを追加して、クエリのCTE実行最適化を無効にします。 組み込みデータセットの例:

    /* cte_execution_mode=inline * /
    共有AS (SELECT L_ORDERKEY、L_SUPPKEY FROM ADB_SampleData_TPCH_10GB.lineitem JOIN ADB_SampleData_TPCH_10GB.orders WHERE L_ORDERKEY = O_ORDERKEY)
    SELECT * FROM shared s1, shared s2 WHERE s1.L_ ORDERKEY = s2.L_ SUPPKEY; 
  • すべてのクエリのCTE実行最適化の無効化

    SETステートメントを実行して、すべてのクエリのCTE実行最適化を無効にします。 例:

    SET adb_config cte_execution_mode=インライン;