Criação de perfil dos manipuladores de procedimentos armazenados do Snowpark Python¶
Você pode descobrir quanto tempo ou memória foi gasto na execução do código do manipulador usando o criador de perfil do código integrado. O criador de perfil gera informações que descrevem quanto tempo ou memória foi gasto na execução de cada linha do manipulador de procedimento.
Usando o criador de perfil, você pode gerar relatórios que se concentram em um dos seguintes itens de cada vez:
Quantidade de tempo por linha, no qual o relatório mostra o número de vezes que uma linha foi executada, quanto tempo levou a execução e assim por diante.
Quantidade de uso de memória por linha, no qual o relatório mostra a quantidade de memória consumida por linha.
O criador de perfil salva o relatório gerado no estágio de usuário interno do Snowflake que você especificar. Você pode ler a saída do criador de perfil usando a função StoredProcedureProfiler.get_output
.
Nota
A criação de perfil introduz uma sobrecarga de desempenho na execução do Python e pode afetar o desempenho da consulta. Ele se destina a desenvolvimento e testes e não deve ser ativado em cargas de trabalho de produção contínua.
Privilégios obrigatórios¶
Quando um procedimento armazenado é executado depois que a função StoredProcedureProfiler.set_active_profiler
é chamada, o Snowflake verifica os seguintes privilégios para o usuário que está executando o procedimento:
Você deve ter privilégios de leitura e gravação no estágio de saída de criação de perfil.
Se o procedimento armazenado com perfil for um procedimento armazenado com direitos do chamador, você deverá usar uma função com privilégio USAGE no procedimento armazenado.
Se o procedimento armazenado com perfil for um procedimento armazenado com direitos do proprietário, você deverá usar uma função com privilégio OWNERSHIP no procedimento armazenado.
Limitações¶
Somente procedimentos armazenados são suportados. O suporte para UDFs ainda não está disponível.
Não há suporte para criação de perfil recursiva. Somente as funções de nível superior dos módulos especificados são analisadas, enquanto as funções definidas dentro das funções não são.
Não há suporte para a criação de perfis de procedimentos armazenados criados no lado do cliente por meio do
snowflake.snowpark
API.As funções Python executadas em paralelo por meio do
joblib
não são analisadas.Os procedimentos armazenados definidos pelo sistema não podem ser analisados. Elas não produzem nenhum resultado.
A API da criação de perfil deve ser usada no mesmo thread do qual o procedimento foi chamado.
Uso¶
Depois de configurar o criador de perfil para uso, você pode usá-lo simplesmente chamando o procedimento armazenado para gerar a saída do criador de perfil. Depois que o procedimento termina de ser executado, a saída do criador de perfil é gravada em um arquivo no estágio que você especificar. Você pode obter a saída do criador de perfil usando uma função do sistema, conforme descrito abaixo.
Siga estas etapas em seu código para configurar e usar o criador de perfil:
Adquira um objeto de criador de perfil do objeto
Session
.Especifique o estágio do Snowflake em que a saída do perfil deve ser gravada.
Ative o criador de perfil e defina em que o relatório de perfil deve se concentrar.
Chame o procedimento armazenado.
Visualize a saída de criação de perfil.
Adquira o objeto do criador de perfil¶
No Python, crie uma variável do tipo StoredProcedureProfiler
para configurar e executar o criador de perfil.
# Create your sesssion
session = Session.builder.configs(CONNECTION_PARAMETERS).create()
# Acquire profiler object
profiler = session.stored_procedure_profiler()
Especifique o estágio do Snowflake em que a saída do perfil deve ser gravada¶
Antes de executar o criador de perfil, você deve especificar um estágio no qual salvar a saída. Para especificar o estágio, chame StoredProcedureProfiler.set_target_stage
, especificando o nome totalmente qualificado de um estágio interno do Snowflake no qual o relatório deve ser gravado.
Tenha em mente o seguinte:
O nome do estágio deve ser um nome totalmente qualificado.
Se o estágio que você colocou nessa função não existir, o Snowflake criará um estágio temporário com esse nome.
Se você quiser preservar a saída do criador de perfil fora do escopo da sessão, crie um estágio permanente antes de executar
set_target_stage
e especifique o nome desse estágio permanente na chamada de função.Se você não definir um estágio de destino com
set_target_stage
, o Snowflake definirá o estágio temporário da sessão atual como o estágio de destino. Para descobrir esse estágio temporário, chameSession.get_session_stage
.
O código no exemplo a seguir cria um estágio temporário de profiler_output
para receber a saída do criador de perfil.
profiler.set_target_stage("mydb.myschema.profiler_output")
Como habilitar o criador de perfil especificando seu foco¶
Use a função StoredProcedureProfiler.set_active_profiler
, especificando um valor que indique o tipo de relatório de perfil que você deseja gerar.
Para que o criador de perfil relate a atividade de uso da linha, defina o parâmetro como o valor
LINE
(não diferencia maiúsculas de minúsculas), conforme mostrado abaixo:profiler.set_active_profiler("LINE")
Para que o criador de perfil relate a atividade de uso da memória, defina o parâmetro como o valor
MEMORY
(não diferencia maiúsculas de minúsculas), conforme mostrado abaixo:profiler.set_active_profiler("MEMORY")
Para desativar o criador de perfil, use a função StoredProcedureProfiler.disable
.
Como chamar o procedimento armazenado¶
Depois que o criador de perfil estiver ativado, chame o procedimento armazenado.
session.call("my_stored_procedure")
Como exibir a saída de criação de perfil¶
No fim da execução, você pode acessar a saída usando a função StoredProcedureProfiler.get_output
.
profiler.get_output()
Inclusão de módulos adicionais para criação de perfis¶
Ao criar perfis, você pode incluir módulos que não são incluídos por padrão.
Por padrão, os métodos definidos em seu módulo são com perfil. Esses métodos incluem os seguintes:
O método do manipulador
Métodos definidos no módulo
Métodos importados de pacotes ou outros módulos
Para incluir módulos adicionais para criação de perfil, use a função StoredProcedureProfiler.register_modules
, especificando os módulos que você deseja incluir.
O código no exemplo a seguir registra os módulos módulo_A e módulo_B para criação de perfil.
profiler.register_modules(["module_A", "module_B"])
Para cancelar o registro de módulos registrados, use register_modules
sem argumentos, como no exemplo a seguir.
profiler.register_modules()
Exemplo¶
Os exemplos a seguir ilustram como usar o criador de perfil para gerar e recuperar um relatório de uso de linha.
O código neste exemplo cria um procedimento profiler_test_proc
.
CREATE OR REPLACE PROCEDURE profiler_test_proc()
RETURNS NUMBER
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'main'
AS
$$
from snowflake.snowpark.functions import col, udf
def main(session):
df = session.sql("select 1")
return df.collect()[0][0]
$$;
O código no exemplo a seguir configura um criador de perfil e, em seguida, cria o perfil do procedimento profiler_test_proc
.
profiler = profiler_session.stored_procedure_profiler
profiler.register_modules(["profiler_test_proc"])
profiler.set_target_stage(
f"{db_parameters['database']}.{db_parameters['schema']}.{tmp_stage_name}"
)
profiler.set_active_profiler("LINE")
profiler_session.call("profiler_test_proc")
res = profiler.get_output()
print(res)
profiler.disable()
profiler.register_modules([])
A saída do criador de perfil de linha gerada tem a seguinte aparência:
Handler Name: main
Python Runtime Version: 3.8
Modules Profiled: ['main_module']
Timer Unit: 0.001 s
Total Time: 0.0619571 s
File: _udf_code.py
Function: main at line 4
Line # Hits Time Per Hit % Time Line Contents
==============================================================
4 def main(session):
5 1 0.4 0.4 0.6 df = session.sql("select 1")
6 1 61.6 61.6 99.4 return df.collect()[0][0]