Ottimizzazione delle query in Snowflake

Introduzione a Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Perché ottimizzare le query in Snowflake?

  • Risultati più veloci
  • Maggiore efficienza dei costi
    • Tempi più brevi usano meno risorse (CPU e memoria).

Uso elevato di CPU e memoria che costa denaro

Introduzione a Snowflake SQL

Problemi comuni nelle query

  • Join esplosivi: fai attenzione!

Errato

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- Mancanza di ON: causa join esplosivi

Dettagli di righe e tempi senza condizione ON

Introduzione a Snowflake SQL

Problemi comuni nelle query

  • Join esplosivi: fai attenzione!

Corretto

SELECT *
FROM order_details AS od
JOIN pizzas AS p
ON od.pizza_id = p.pizza_id

Dettagli di righe e tempi con condizione ON

Introduzione a Snowflake SQL

Problemi comuni nelle query

  • UNION o UNION ALL: conosci la differenza
    • UNION rimuove i duplicati e rallenta la query
    • UNION ALL è più veloce se non ci sono duplicati
  • Gestione di big data
    • Usa filtri per restringere i dati
    • Applica limiti per risultati più rapidi
Introduzione a Snowflake SQL

Come ottimizzare le query?

SELECT * ⏳

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Dettagli query: tempo e righe

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Dettagli query con LIMIT 10

Introduzione a Snowflake SQL

Come ottimizzare le query?

Uso di SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Dettagli query: tempo e righe

Evita SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Dettagli query: tempo e righe usando colonne specifiche

Introduzione a Snowflake SQL

Come ottimizzare le query?

Filtra prima

  • Usa la clausola WHERE all’inizio
  • Applica i filtri prima dei JOIN
    • Il JOIN elabora meno righe
Introduzione a Snowflake SQL

Senza filtro anticipato

SELECT orders.order_id, 
       orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM orders
JOIN order_details 
ON orders.order_id = order_details.order_id
JOIN pizzas 
ON order_details.pizza_id = pizzas.pizza_id
JOIN pizza_type 
ON pizzas.pizza_type_id = pizza_type.pizza_type_id
WHERE orders.order_date = '2015-01-01';  -- Filtro dopo il JOIN
Introduzione a Snowflake SQL

Con filtro anticipato

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- Filtro nella CTE prima del JOIN
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- JOIN con la CTE
JOIN order_details
ON filtered_orders.order_id = order_details.order_id
JOIN pizzas
ON order_details.pizza_id = pizzas.pizza_id
JOIN pizza_type
ON pizzas.pizza_type_id = pizza_type.pizza_type_id;
Introduzione a Snowflake SQL

Cronologia query

  • Cronologia query
    • snowflake.account_usage.query_history
    • Fornisce metriche come il tempo di esecuzione
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

Screenshot 2023-09-01 at 14.32.29.png

  • ILIKE: confronto stringhe senza distinzione tra maiuscole/minuscole
Introduzione a Snowflake SQL

Cronologia query

  • Individua query lente o eseguite spesso
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Filtro dei risultati con execution_time maggiore di 1000 ms

Introduzione a Snowflake SQL

Passons à la pratique !

Introduzione a Snowflake SQL

Preparing Video For Download...