Snowpark Python: Snowpark 생성 쿼리에서 반복되는 하위 쿼리 제거(취소됨)

주의

이 BCR 은 취소되고 2025_04 번들(일반적으로 활성화됨) 에서 제거되었습니다.

반복 하위 쿼리 제거를 통해 쿼리 플랜 내에서 동일한 하위 DataFrames를 식별하고, CTEs(공통 테이블 식)를 사용하여 최종 쿼리를 구성합니다. 컴파일 시간이 1초를 초과하는 쿼리의 약 절반에는 하나 이상의 중복 하위 쿼리가 포함되어 있습니다. 이 최적화의 이점은 식별된 중복 하위 쿼리의 양과 복잡성에 비례하여 증가합니다.

  • 진단 단계:

    • 이전에는 오류 없이 실행 중이던 Snowpark 데이터 파이프라인에서 SQL 컴파일 오류가 발생했습니다.

    • SQL 생성의 버그로 인해 잘못된 결과가 생성되었습니다.

  • 완화 방법:

    • 이전 버전의 Snowpark 클라이언트로 다운그레이드하면 문제가 완화됩니다.

    • 매개 변수 PYTHON_SNOWPARK_USE_CTE_OPTIMIZATION_VERSION 설정을 취소하면 이 문제가 완화됩니다.

      이 변경 사항의 영향을 받지 않으려면 Snowpark 기반 워크플로를 1.31.1 미만의 Snowpark Python 버전으로 고정합니다. 예를 들어, Python 저장 프로시저를 사용하는 경우 저장 프로시저를 만들 때 PACKAGES=('snowflake-snowpark-python==1.30.0') 을 설정합니다. Snowflake Notebook 또는 Python 워크시트의 경우 1.31.1 미만의 Snowpark Python 버전으로 전환합니다.

이전 동작과 새 동작의 차이점을 보려면 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
변경 전:

위의 union_all 은 동일한 위의 DataFrame df1 을 두 번 사용하고 있으므로 생성된 SQL쿼리는 기본 하위 쿼리를 두 번 반복합니다.

( 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
변경 후:

최적화는 df1 가 두 번 사용되고 있음을 감지하고, 하위 쿼리를 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