Avaliação preguiçosa
Exemplo: Preguiçoso vs Eager
Benefícios da Avaliação Preguiçosa
- Otimização de Consultas: várias operações são compiladas em uma única consulta SQL otimizada
- Pushdown de Filtros: os filtros são aplicados no nível da fonte de dados
- Poda de Colunas: apenas as colunas necessárias são lidas
- Decisões Adiadas: o mecanismo de execução pode ser escolhido em tempo de execução
- Inspeção do Plano: você pode visualizar e depurar a consulta antes de executá-la
Gatilhos de execução
Gatilhos automáticos
| Gatilho | Exemplo | Descrição |
|---|---|---|
print() / repr() | print(ds) | Exibe os resultados |
len() | len(ds) | Obtém a contagem de linhas |
.columns | ds.columns | Obtém os nomes das colunas |
.dtypes | ds.dtypes | Obtém os tipos das colunas |
.shape | ds.shape | Obtém as dimensões |
.index | ds.index | Obtém o índice das linhas |
.values | ds.values | Obtém o array NumPy |
| Iteração | for row in ds | Itera sobre as linhas |
to_df() | ds.to_df() | Converte para pandas |
to_pandas() | ds.to_pandas() | Alias de to_df |
to_dict() | ds.to_dict() | Converte para dict |
to_numpy() | ds.to_numpy() | Converte para array |
.equals() | ds.equals(other) | Compara DataStores |
Operações que permanecem preguiçosas
| Operação | Retorna | Descrição |
|---|---|---|
filter() | DataStore | Adiciona cláusula WHERE |
select() | DataStore | Adiciona seleção de colunas |
sort() | DataStore | Adiciona ORDER BY |
groupby() | LazyGroupBy | Prepara GROUP BY |
join() | DataStore | Adiciona JOIN |
ds['col'] | ColumnExpr | Referência de coluna |
ds[['col1', 'col2']] | DataStore | Seleção de colunas |
Execução em três fases
Fase 1: Construção da consulta SQL (Preguiçoso)
Fase 2: Ponto de execução
Fase 3: Operações com DataFrame (se houver)
Visualizando planos de execução
explain() para ver o que será executado:
Query
Response
verbose=True para obter mais detalhes:
Armazenamento em cache
Como o cache funciona
Invalidação do cache
Controle manual do cache
Combinando operações de SQL e Pandas
Operações compatíveis com SQL
filter(),where()select()groupby(),agg()sort(),orderby()limit(),offset()join(),union()distinct()- Operações em colunas (matemática, comparação, métodos de string)
Operações exclusivas do Pandas
apply()com funções personalizadaspivot_table()com agregações complexasstack(),unstack()- Operações em DataFrames já executados
Pipelines híbridos
Seleção do mecanismo de execução
Modo automático (padrão)
Forçar o mecanismo chDB
Forçar o mecanismo do pandas
Impactos no desempenho
Bom: aplique o filtro no início
Ruim: filtrar só no fim
Bom: selecione as colunas desde o início
Bom: deixe o SQL fazer o trabalho
Resumo das práticas recomendadas
- Encadeie as operações antes de executar - Monte a consulta completa e só então acione a execução uma vez
- Filtre o quanto antes - Reduza os dados na origem
- Selecione apenas as colunas necessárias - A eliminação de colunas melhora o desempenho
- Use
explain()para entender a execução - Depure antes de executar - Deixe o SQL cuidar das agregações - O ClickHouse é otimizado para isso
- Fique atento aos gatilhos de execução - Evite execuções antecipadas acidentais
- Use cache com critério - Entenda quando o cache é invalidado