Vai al contenuto principale
Prestazioni e ottimizzazione query su S3 - immagine ufficiale della lezione su GinnyTech, creata da AD

Prestazioni e ottimizzazione query su S3

Tecniche avanzate per query veloci su data lake: caching, materializzazione, statistiche.

AD
Creato daAndrii Dyshkantiuk
Lezione 105 / 236Livello: AvanzatoDurata: 18 minPrerequisiti: 1

Cosa imparerai

  • Comprendere il problema analitico e il contesto decisionale
  • Applicare esempi, metriche e controlli a casi reali

import pandas as pd

Prestazioni e ottimizzazione query su S3

Una query su un data lake S3 può risultare lenta non per colpa del motore, ma per file troppo piccoli, formati sbagliati, partizioni inutili o scansioni troppo ampie. Ottimizzare le prestazioni significa collegare layout, formato, compressione e pruning al costo reale delle analisi. Il tema è tecnico, e il punto è capire quale leva sposta davvero latenza e fattura quando interroghi dati su object storage.

Da dove nasce la lentezza

Prima di cambiare motore conviene capire dove va il tempo. La diagnosi parte da quattro domande: quanti dati legge la query, da quanti file, in quale formato e con quale possibilità di evitare i dati irrilevanti. Spesso il collo di bottiglia non è il calcolo ma l’I/O su S3: migliaia di file piccoli da aprire, colonne lette inutilmente, partizioni non sfruttate. Una query utile diventa economica solo quando questi quattro fattori sono sotto controllo.

Una griglia per impostare la diagnosi

Conviene seguire una sequenza che lega ogni scelta a un costo misurabile.

PassaggioDomanda da fareOutput atteso
DecisioneQuale leva di performance stiamo valutando?Intervento esplicito
SegnaleQuanti GB e quanti file legge la query?Misura osservabile
BaselineQuanto costa oggi la query tipica?Costo di riferimento
VincoloCosa limita il parallelismo?Assunzione dichiarata
AzioneQuale ottimizzazione applichiamo?Cambiamento verificabile

Ogni riga deve rendere più chiaro il costo di un intervento sbagliato, per esempio comprimere senza ridurre i file piccoli.

Rendere misurabile l’intervento

L’unità su cui ragioni è la query, con il suo piano di esecuzione e i suoi file di input. Il segnale che osservi sono i GB scansionati e il tempo di risposta. La baseline è il costo della query prima dell’intervento. La soglia decisionale è il risparmio che giustifica il lavoro, fissato prima di iniziare. Il rischio residuo è ottimizzare una query che gira di rado, spendendo tempo dove l’impatto è marginale.

ElementoDefinizione operativaControllo minimo
Unità di analisiLa singola query e i suoi inputPiano, file, formato
Variabile osservataGB scansionati e latenzaMisura ripetibile
BaselineCosto prima dell’ottimizzazioneConfronto diretto
Soglia decisionaleRisparmio minimo che giustifica l’interventoCriterio scritto prima
Rischio residuoOttimizzare query poco frequentiRevisione della frequenza

Statistiche di tabella e colonna

Parquet porta statistiche incorporate per ogni row group: minimo, massimo e conteggio dei null. Athena le usa per saltare i row group non rilevanti. Aggiornare le statistiche con ANALYZE migliora le decisioni del query planner:

ANALYZE orders COMPUTE STATISTICS;
ANALYZE orders COMPUTE STATISTICS FOR COLUMNS customer_id;

La dimensione dei file conta

I file non devono essere né troppo piccoli né troppo grandi. Sotto i 50 MB l’overhead di apertura e di listing su S3 domina il tempo della query. Sopra 1 GB i file diventano pochi e il parallelismo si riduce, perché Athena parallelizza per file e non per row group. Il bersaglio ragionevole è tra 200 e 500 MB per file Parquet. Se ti ritrovi con tanti file piccoli, compattali con un CREATE TABLE AS SELECT.

Caching dei risultati

Athena conserva automaticamente i risultati per 24 ore quando la query e i parametri coincidono, salvandoli su S3. Le query ripetute costano zero e tornano istantanee. Per una dashboard che si aggiorna spesso, questo comportamento fa la differenza tra un report fluido e una bolletta che cresce.

Pre-aggregazione con CTAS

Per le dashboard con query ricorrenti conviene pre-calcolare i risultati una volta sola:

CREATE TABLE daily_orders_agg AS
SELECT order_date, customer_id, SUM(amount) AS daily_total
FROM orders GROUP BY order_date, customer_id;

La dashboard legge da daily_orders_agg, una tabella circa 100 volte più piccola, invece che dalla orders completa. Costa meno e risponde prima. Il pattern è semplice e l’impatto sproporzionato rispetto allo sforzo.

Un caso concreto

Una query Athena scansiona 800 GB per calcolare un KPI settimanale, perché legge CSV non compressi sparsi su migliaia di file piccoli. Convertendo a Parquet, compattando i file, partizionando per data e sfruttando il pruning, il costo e la latenza crollano senza toccare la domanda business. La risposta resta la stessa, cambia solo quanto dato il motore deve leggere per produrla.

Evidenza osservataLettura prudenteAzione consigliata
La query legge centinaia di GBFormato o layout inefficienteConvertire a Parquet e partizionare
Migliaia di file piccoliOverhead di listing elevatoCompattare con CTAS
Stessa query ripetuta ogni oraCalcolo ridondanteSfruttare cache o pre-aggregazione

Esercizio

Per il livello base, scrivi in cinque righe quale query vuoi rendere più veloce: indica i GB scansionati oggi, l’intervento previsto e il risparmio atteso.

Per il livello intermedio, costruisci una tabella con quattro colonne: query osservata, costo attuale, ottimizzazione proposta, costo atteso. Includi almeno un caso in cui l’intervento non vale lo sforzo.

Per il livello research-grade, prepara un memo che includa baseline misurata, ipotesi sul risparmio, soglia di convenienza e piano di monitoraggio della spesa dopo il rollout. Come dataset usa S3 con Parquet, Athena, Glue o un log storage; se non hai dati reali, genera un set sintetico con almeno 200 righe, una dimensione temporale, un segmento e una metrica di outcome.

Errore tipico da evitare

L’errore più comune è cambiare il motore o aggiungere infrastruttura prima di misurare dove va il tempo. Si finisce per ottimizzare il pezzo sbagliato, magari comprimendo dati che il pruning avrebbe già escluso. La domanda di controllo è: se la query restasse lenta dopo l’intervento, quale assunzione avrei sbagliato? Se non sai rispondere con un numero, ti manca ancora la baseline.

Checkpoint

  1. Quanti GB scansiona oggi la query che vuoi ottimizzare?
  2. Da quanti file legge e in quale formato?
  3. Quale leva riduce di più la scansione nel tuo caso?
  4. Quale risparmio giustifica il lavoro di ottimizzazione?
  5. Come verifichi che il guadagno regga nel tempo?

Le prestazioni su S3 si governano misurando prima quanto e da dove legge una query, poi agendo su formato, dimensione dei file, partizionamento, statistiche e caching. Parquet ben dimensionato, file tra 200 e 500 MB, pruning sfruttato e risultati pre-aggregati spostano latenza e costo molto più di un cambio di motore. Una buona ottimizzazione si chiude con un numero: GB scansionati prima e dopo, sulla stessa query.


Riferimenti:

  • AWS. (2024). “Athena Performance Tuning.” docs.aws.amazon.com/athena.