Snowflake-queryoptimalisatie

Introductie tot Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Waarom queries optimaliseren in Snowflake?

  • Snellere resultaten
  • Kostenbesparing
    • Kortere looptijd gebruikt minder CPU en geheugen

Afbeelding van hoog CPU/geheugenverbruik dat geld kost

Introductie tot Snowflake SQL

Veelvoorkomende queryproblemen

  • Exploderende joins: wees voorzichtig!

Onjuist

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- Ontbrekende ON-voorwaarde leidt tot exploderende joins

Resultaat: rijen en tijd zonder ON-voorwaarde

Introductie tot Snowflake SQL

Veelvoorkomende queryproblemen

  • Exploderende joins: wees voorzichtig!

Juist

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

Resultaat: rijen en tijd met ON-voorwaarde

Introductie tot Snowflake SQL

Veelvoorkomende queryproblemen

  • UNION of UNION ALL: ken het verschil
    • UNION verwijdert duplicaten, maakt trager
    • UNION ALL is sneller als er geen duplicaten zijn
  • Grote datasets behandelen
    • Filter om te verkleinen
    • Gebruik LIMITs voor snellere resultaten
Introductie tot Snowflake SQL

Hoe optimaliseer je queries?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Querydetails, tijd en aantal rijen

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Querydetails, tijd en rijen met LIMIT 10

Introductie tot Snowflake SQL

Hoe optimaliseer je queries?

SELECT * gebruiken ⌛

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Querydetails, tijd en aantal rijen

Vermijd SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Querydetails, tijd en rijen met geselecteerde kolomnamen

Introductie tot Snowflake SQL

Hoe optimaliseer je queries?

Vroeg filteren

  • Gebruik WHERE zo vroeg mogelijk
  • Filter vóór JOINs
    • JOIN verwerkt dan minder rijen
Introductie tot Snowflake SQL

Zonder vroeg filteren

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';  -- Filteren na JOIN
Introductie tot Snowflake SQL

Met vroeg filteren

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- Filteren in CTE vóór JOIN
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- Joinen met 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;
Introductie tot Snowflake SQL

Querygeschiedenis

  • Querygeschiedenis
    • snowflake.account_usage.query_history
    • Biedt metrics zoals uitvoeringstijd
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: hoofdletterongevoelige tekenreeksvergelijking
Introductie tot Snowflake SQL

Querygeschiedenis

  • Vind trage of vaak uitgevoerde queries
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Filteren op uitvoeringstijd > 1000 ms

Introductie tot Snowflake SQL

Laten we oefenen!

Introductie tot Snowflake SQL

Preparing Video For Download...