Snowpark Python: Snowpark 생성 쿼리에서 반복 하위 쿼리 제거

주의

이 동작 변경 사항은 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