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])
Copy
Antes da mudança:

Porque o union_all acima está usando o mesmo DataFrame df1 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 ) )
Copy
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 ) )
Copy

Ref: 1995