Evaluación diferida
Ejemplo: evaluación diferida vs. inmediata
Beneficios de la evaluación diferida
- Optimización de consultas: Varias operaciones se convierten en una única consulta SQL optimizada
- Pushdown de filtros: Los filtros se aplican a nivel de la fuente de datos
- Poda de columnas: Solo se leen las columnas necesarias
- Decisiones diferidas: El motor de ejecución puede elegirse en tiempo de ejecución
- Inspección del plan: Puede ver/depurar la consulta antes de ejecutarla
Activadores de ejecución
Activadores automáticos
| Activador | Ejemplo | Descripción |
|---|---|---|
print() / repr() | print(ds) | Mostrar resultados |
len() | len(ds) | Obtener el número de filas |
.columns | ds.columns | Obtener los nombres de las columnas |
.dtypes | ds.dtypes | Obtener los tipos de las columnas |
.shape | ds.shape | Obtener las dimensiones |
.index | ds.index | Obtener el índice de filas |
.values | ds.values | Obtener un array de NumPy |
| Iteración | for row in ds | Iterar sobre las filas |
to_df() | ds.to_df() | Convertir a pandas |
to_pandas() | ds.to_pandas() | Alias de to_df |
to_dict() | ds.to_dict() | Convertir a dict |
to_numpy() | ds.to_numpy() | Convertir a un array |
.equals() | ds.equals(other) | Comparar DataStores |
Operaciones que siguen siendo diferidas
| Operación | Devuelve | Descripción |
|---|---|---|
filter() | DataStore | Añade la cláusula WHERE |
select() | DataStore | Añade la selección de columnas |
sort() | DataStore | Añade ORDER BY |
groupby() | LazyGroupBy | Prepara GROUP BY |
join() | DataStore | Añade JOIN |
ds['col'] | ColumnExpr | Referencia de columna |
ds[['col1', 'col2']] | DataStore | Selección de columnas |
Ejecución en tres fases
Fase 1: Construcción perezosa de consultas SQL
Fase 2: Punto de ejecución
Fase 3: Operaciones de DataFrame (si las hay)
Ver planes de ejecución
explain() para ver qué se ejecutará:
Query
Response
verbose=True para obtener más información:
Caché
Cómo funciona la caché
Invalidación de caché
Control manual de caché
Combinación de operaciones SQL y de Pandas
Operaciones compatibles con SQL
filter(),where()select()groupby(),agg()sort(),orderby()limit(),offset()join(),union()distinct()- Operaciones sobre columnas (matemáticas, comparación, métodos de cadenas)
Operaciones exclusivas de Pandas
apply()con funciones personalizadaspivot_table()con agregaciones complejasstack(),unstack()- Operaciones sobre DataFrames ejecutados
Canalizaciones híbridas
Selección del motor de ejecución
Modo automático (predeterminado)
Forzar el motor chDB
Forzar el motor de pandas
Implicaciones en el rendimiento
Bien: filtrar pronto
Mal: filtrar tarde
Bien: Selecciona las columnas desde el principio
Bien: deja que SQL haga el trabajo
Resumen de buenas prácticas
- Encadena las operaciones antes de ejecutar - Construye la consulta completa y luego ejecútala una sola vez
- Filtra cuanto antes - Reduce los datos en el origen
- Selecciona solo las columnas necesarias - Descartar columnas mejora el rendimiento
- Usa
explain()para entender la ejecución - Depura antes de ejecutar - Deja que SQL se encargue de las agregaciones - ClickHouse está optimizado para ello
- Ten en cuenta qué desencadena la ejecución - Evita ejecutar antes de tiempo por accidente
- Usa la caché con criterio - Comprende cuándo se invalida