Spark

Nivel medio

¿Por qué mis tablas Delta/Iceberg se vuelven más lentas cada semana aunque la consulta no cambió?

La consulta es idéntica. La tabla debajo no lo es - cada escritura por micro-batch añade más archivos pequeños, y el tiempo de escaneo sigue casi tanto el número de archivos como el volumen de datos.

Leer en:
Escaneo día 1 Tras 30 días Tras OPTIMIZE
Aproximadamente cómo deriva el tiempo de escaneo con la acumulación de archivos pequeños, y qué recupera la compactación - no un benchmark medido.

Una tabla alimentada cada cinco minutos por un job de streaming acumula miles de archivos pequeños al mes - y cada consulta contra ella paga el overhead por archivo sin importar cuán poco contenga cada uno.

De dónde vienen realmente los archivos pequeños

Los writers de streaming y micro-batch confirman un archivo nuevo (a menudo varios, uno por partición tocada) en cada trigger. Con un trigger de 5 minutos, son cientos de archivos al día por partición - cada uno pequeño, cada uno añadiendo su propio costo de apertura y lectura de metadatos a cada escaneo futuro, sin importar cuán poco contenga realmente.

Qué arregla y qué no arregla OPTIMIZE/compactación

La compactación reescribe muchos archivos pequeños en menos y más grandes, que es lo que realmente arregla el tiempo de escaneo. Lo que no hace: recuperar espacio en disco - los archivos viejos y nuevos deben coexistir, ya que los snapshots anteriores de la tabla (usados para time-travel) todavía referencian a los originales - y no arregla un esquema de particionado que estaba mal desde el principio.

# reescribe archivos; no borra los viejos OPTIMIZE events WHERE event_date >= current_date() - INTERVAL 7 DAYS

VACUUM es un paso separado y más riesgoso

VACUUM es lo que realmente borra archivos ya no referenciados por el snapshot actual de la tabla, pasada una ventana de retención - ese es el paso que recupera el costo de almacenamiento. Una ventana de retención demasiado corta puede borrar archivos que un lector concurrente o una consulta de time-travel en curso todavía necesita, por eso es un comando separado y deliberado, no algo que la compactación ejecuta automáticamente.

Vea cómo se ve esto en su propio pipeline.

Suba un event log real de Spark, un run_results.json de dbt o una exportación de métricas de Flink y obtenga recomendaciones concretas, que debe aprobar antes de aplicar - no otra regla general.