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

  • Convertire i dati in Parquet compresso con file tra 200 e 500 MB
  • Aggiornare le statistiche con ANALYZE e sfruttare cache e pre-aggregazioni
  • Misurare GB scansionati e latenza prima e dopo l'ottimizzazione

Prestazioni e ottimizzazione query su S3

Questa lezione, come le altre del binario ml-tabellare, parte da una constatazione che sorprende sempre chi arriva dai database tradizionali: una query su un data lake S3 può essere 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.

L’idea in una frase

Ottimizzare le query su S3 significa ridurre i dati letti con formato, dimensione dei file, partizionamento, statistiche e caching prima di cambiare motore.

Come procedere, passo dopo passo

  1. Misura GB scansionati, numero di file e formato della query più costosa.
  2. Converti i dati in Parquet compresso con file tra 200 e 500 MB.
  3. Applica il partition pruning e seleziona solo le colonne necessarie.
  4. Aggiorna le statistiche e sfrutta cache o pre-aggregazioni per le query ripetute.
  5. Rimisura la stessa query e confronta costo e latenza prima e dopo.

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 lo scambio con S3: migliaia di file piccoli da aprire, colonne lette inutilmente e partizioni non sfruttate. Una query 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 chiarire il costo di un intervento sbagliato, per esempio comprimere senza ridurre i file piccoli.

Rendere misurabile l’intervento

L’unità di ragionamento è la query, con piano di esecuzione e file di input. Il segnale osservato sono i GB scansionati e il tempo di risposta. La baseline è il costo prima dell’intervento. La soglia decisionale è il risparmio che giustifica il lavoro, fissata prima di iniziare. Il rischio residuo è ottimizzare una query rara, 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 include statistiche 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 sono 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 hai tanti file piccoli, compattali con un CREATE TABLE AS SELECT.

Caching dei risultati

Athena conserva automaticamente i risultati per 24 ore quando query e parametri coincidono, salvandoli su S3. Le query ripetute costano zero e tornano istantanee. Per una dashboard aggiornata spesso, questo comportamento distingue un report fluido da una bolletta in crescita.

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 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, costo e 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

Errore tipico da evitare

L’errore più comune è cambiare motore o aggiungere infrastruttura prima di misurare dove va il tempo. Così ottimizzi 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 rispondi con un numero, ti manca ancora la baseline.

Verdetto: converti in Parquet, compatta tra 200 e 500 MB, sfrutta pruning e cache, e cambia motore solo se la baseline resta alta dopo questi interventi.

Riferimenti

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

Il caso Apache Parquet

Apache Parquet è nato nel 2013 dalla collaborazione tra Twitter e Cloudera come formato colonnare aperto per l’ecosistema Hadoop. La sua forza sta nelle statistiche per row group, con minimo, massimo e conteggio dei null, che permettono ai motori di saltare i blocchi irrilevanti. Rispetto al CSV non compresso, il colonnare compresso legge solo le colonne richieste e riduce drasticamente i GB scansionati. Il caso mostra perché la prima leva di performance è il formato dei file e non il motore che li legge.

Domande per verificare quello che hai capito

  1. Quanti GB scansiona oggi la query che vuoi ottimizzare?
  2. Da quanti file legge e in quale formato sono scritti?
  3. Quale leva tra formato, compattazione, pruning e cache riduce di più la tua scansione?
  4. Quale risparmio minimo giustifica il lavoro di ottimizzazione?
  5. Come verifichi che il guadagno su costo e latenza regga nel tempo?
Serve una mano concreta?

Bloccato su questo argomento o vuoi applicarlo al tuo caso? Prenota una call di 15 minuti con un analista esperto.

Prenota una call