Abfrageoptimierung in Snowflake

Einführung in Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Warum Abfragen in Snowflake optimieren?

  • Schnellere Ergebnisse
  • Kosteneffizienz
    • Kürzere Abfragezeiten benötigen weniger Ressourcen wie CPU und Speicher

Image depicting high usage of CPU and memory leading to money

Einführung in Snowflake SQL

Häufige Probleme bei der Abfrage

  • Übermäßig viele Joins: Vorsicht!

Falsch

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

Query results rows and time details with no ON condition

Einführung in Snowflake SQL

Häufige Probleme bei der Abfrage

  • Übermäßig viele Joins: Vorsicht!

Richtig

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

Query results rows and time details with ON condition

Einführung in Snowflake SQL

Häufige Probleme bei der Abfrage

  • UNION oder UNION ALL: wichtiger Unterschied
    • UNION entfernt Duplikate, verlangsamt die Abfrage
    • UNION ALL ist schneller, wenn keine Duplikate
  • Umgang mit großen Datenmengen
    • Filter benutzen, um die Daten einzugrenzen
    • Begrenzungen nutzen, um schneller Ergebnisse zu erhalten
Einführung in Snowflake SQL

Wie lassen sich Abfragen optimieren?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Query details, time and rows details

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Query details, time and rows details using LIMIT 10

Einführung in Snowflake SQL

Wie lassen sich Abfragen optimieren?

Mit SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Query details, time and rows details

Ohne SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Query details, time and rows details using select column names

Einführung in Snowflake SQL

Wie lassen sich Abfragen optimieren?

Frühzeitig filtern

  • WHERE-Klausel frühzeitig nutzen
  • Filter vor JOIN hinzufügen
    • JOIN muss weniger Zeilen verarbeiten
Einführung in Snowflake SQL

Ohne frühzeitige Filterung

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
Einführung in Snowflake SQL

Mit frühzeitiger Filterung

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;
Einführung in Snowflake SQL

Abfragehistorie

  • Abfragehistorie
    • snowflake.account_usage.query_history
    • Die Abfragehistorie zeigt verschiedene Metriken wie die Ausführungszeit
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: Groß-/Kleinschreibung ignorieren beim Vergleichen von Strings
Einführung in Snowflake SQL

Abfragehistorie

  • Langsame oder oft ausgeführte Abfragen ermitteln
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Filtering result based on execution time greater than 1000ms

Einführung in Snowflake SQL

Lass uns üben!

Einführung in Snowflake SQL

Preparing Video For Download...