Snowpark Python:Snowparkが生成したクエリで、繰り返しのサブクエリを排除する|BCRBundle2025_04State|

注意

この動作変更は2025_04バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

繰り返しのサブクエリの削除は、同一のサブ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])
Copy
変更前:

上記の: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 ) )
Copy
変更後:

最適化によって: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 ) )
Copy

参照:1995