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=インライン;