Snowflake-frågeoptimering

Introduktion till Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Varför optimera frågor i Snowflake?

  • Snabbare resultat
  • Kostnadseffektivitet
    • Kortare frågetider förbrukar mindre resurser som CPU och minne.

Bild som visar hög CPU- och minnesanvändning som leder till kostnader

Introduktion till Snowflake SQL

Vanliga frågeproblem

  • Explosiva joins: Var försiktig!

Felaktigt

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- Missing ON condition leading to exploding joins

Frågeresultat med rader och tidsinformation utan ON-villkor

Introduktion till Snowflake SQL

Vanliga frågeproblem

  • Explosiva joins: Var försiktig!

Korrekt

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

Frågeresultat med rader och tidsinformation med ON-villkor

Introduktion till Snowflake SQL

Vanliga frågeproblem

  • UNION eller UNION ALL: Känn skillnaden
    • UNION tar bort dubbletter och saktar ned frågan
    • UNION ALL är snabbare om inga dubbletter finns
  • Hantera stora datamängder
    • Använd filter för att begränsa data
    • Tillämpa begränsningar för snabbare resultat
Introduktion till Snowflake SQL

Hur optimerar man frågor?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Frågeinformation med tids- och raduppgifter

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Frågeinformation med tids- och raduppgifter med LIMIT 10

Introduktion till Snowflake SQL

Hur optimerar man frågor?

Använder SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Frågeinformation med tids- och raduppgifter

Undvik SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Frågeinformation med tids- och raduppgifter vid val av kolumnnamn

Introduktion till Snowflake SQL

Hur optimerar man frågor?

Filtrera tidigt

  • Använd WHERE-satsen tidigt
  • Tillämpa filter före JOIN
    • JOIN behöver då bearbeta färre rader
Introduktion till Snowflake SQL

Utan tidig filtrering

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';  -- Filtering after JOIN
Introduktion till Snowflake SQL

Med tidig filtrering

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- Filtering in CTE before JOIN
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- Joining with 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;
Introduktion till Snowflake SQL

Frågehistorik

  • Frågehistorik
    • snowflake.account_usage.query_history
    • Frågehistoriken ger olika mätvärden, till exempel körningstid
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: Skiftlägesokänslig strängmatchning
Introduktion till Snowflake SQL

Frågehistorik

  • Identifiera långsamma eller ofta körda frågor
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Filtrerat resultat baserat på körningstid över 1 000 ms

Introduktion till Snowflake SQL

Nu kör vi en övning!

Introduktion till Snowflake SQL

Preparing Video For Download...