Snowpark Python: Snowpark 생성 쿼리에서 반복 하위 쿼리 제거 ¶
반복 하위 쿼리 제거를 통해 쿼리 플랜 내에서 동일한 하위 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])
- 변경 전:
위의
union_all
은 동일한 위의 DataFramedf1
을 두 번 사용하고 있으므로 생성된 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 ) )
- 변경 후:
최적화는
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 ) )
참조: 1995