Snowpark Python:Snowparkが生成したクエリで、繰り返しのサブクエリを排除する|BCRBundle2025_04State|¶
繰り返しのサブクエリの削除は、同一のサブDataFrames をクエリプラン内で識別し、共通テーブル式(CTEs)を採用して最終的なクエリを構築します。コンパイル時間が1秒を超えるクエリのほとんど半分に、少なくとも1つの冗長なサブクエリが含まれています。この最適化の利点は、特定された重複サブクエリの量と複雑さによってスケールします。
診断ステップ:
以前はエラーなしで実行されていたSnowparkデータパイプラインでSQL コンパイルエラーが発生。
SQL 生成のバグによって誤った結果が生成。
軽減策:
Snowparkクライアントを古いバージョンにダウングレードすると、問題が軽減されます。
パラメーター
PYTHON_SNOWPARK_USE_CTE_OPTIMIZATION_VERSION
を設定解除することで問題を軽減します。この変更の影響を受けないようにするには、Snowparkベースのワークフローを1.31.1より前のSnowpark Pythonバージョンに固定してください。たとえば、 Pythonストアドプロシージャを使用している場合は、ストアドプロシージャを作成する際に:code:
PACKAGES=('snowflake-snowpark-python==1.30.0')
を設定します。SnowflakeノートブックまたはPythonワークシートの場合は、 Snowpark Pythonバージョンを1.31.1より前に切り替えます。
新旧の動作の違いを示すためには、Snowpark Pythonでの次のようなDataFrame変換を検討してください。
df = session.table("test_table")
df1 = df.with_column("a", F.col("A") + 1).filter(df.a > 1)
df1 = df1.union_all(df1)
print(df1.queries["queries"][0])
- 変更前:
上記の:code:
union_all`では、同じDataFrame:code:`df1
を2回使用しており、生成された SQL クエリは基になるサブクエリを2回繰り返します。( SELECT * FROM ( SELECT "B", "C", ( "A" + 1 ) AS "A" FROM test_table ) WHERE ( "A" > 1 ) ) UNION ALL ( SELECT * FROM ( SELECT "B", "C", ( "A" + 1 ) AS "A" FROM test_table ) WHERE ( "A" > 1 ) )
- 変更後:
最適化によって:code:
df1
が2回使用されていることが検出され、サブクエリはCTE 式に置き換わり、それを使用してクエリを作成します。WITH SNOWPARK_TEMP_CTE_7G3ZFVJYBK AS ( SELECT * FROM ( SELECT "B", "C", ( "A" + 1 ) AS "A" FROM test_table ) WHERE ( "A" > 1 ) ) ( SELECT * FROM ( SNOWPARK_TEMP_CTE_7G3ZFVJYBK ) ) UNION ALL ( SELECT * FROM ( SNOWPARK_TEMP_CTE_7G3ZFVJYBK ) )
参照:1995