Snowpark Python: Eliminação de subconsultas repetidas em consultas geradas pelo Snowpark ¶
Atenção
Essa mudança de comportamento está no pacote 2025_04.
Para saber o status atual do pacote, consulte Histórico do pacote.
A eliminação de subconsultas repetidas identifica subDataFrames idênticos dentro de um plano de consulta e emprega expressões de tabela comuns (CTEs) para construir a consulta final. Quase metade das consultas com tempos de compilação superiores a um segundo contém pelo menos uma subconsulta redundante. O benefício dessa otimização é dimensionado com a quantidade e complexidade das subconsultas duplicadas identificadas.
Etapas de diagnóstico:
Erro de compilação do SQL em um pipeline de dados do Snowpark que estava sendo executado sem erros anteriormente.
Resultados incorretos gerados devido a bugs na geração do SQL.
Mitigação:
Baixar para uma versão mais antiga do cliente Snowpark atenua o problema.
Desativar o parâmetro
PYTHON_SNOWPARK_USE_CTE_OPTIMIZATION_VERSION
atenua o problema.Para não serem afetados por essa mudança, mantenha os fluxos de trabalho baseados em Snowpark fixados em uma versão do Snowpark Python inferior a 1.31.1. Por exemplo, se você estiver usando um procedimento armazenado Python, defina
PACKAGES=('snowflake-snowpark-python==1.30.0')
ao criar o procedimento armazenado. No caso de um notebook Snowflake ou planilha Python, mude para uma versão do Snowpark Python anterior à 1.31.1.
Para demonstrar a diferença entre o comportamento antigo e o novo, considere as seguintes transformações do DataFrame no Snowpark Python:
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])
- Antes da mudança:
Porque o
union_all
acima está usando o mesmo DataFramedf1
duas vezes, as consultas SQL geradas repetirão a subconsulta subjacente duas vezes:( 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 ) )
- Após a mudança:
A otimização detectará que
df1
está sendo usado duas vezes, substituirá a subconsulta por uma expressão CTE e a usará para criar a consulta: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 ) )
Ref: 1995