Optymalizacja zapytań w Snowflake

Wprowadzenie do Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Dlaczego optymalizować zapytania w Snowflake?

  • Szybsze wyniki
  • Efektywność kosztowa
    • Krótszy czas zapytań zmniejsza zużycie CPU i pamięci.

Wysoki poziom zużycia CPU i pamięci przekładający się na koszty

Wprowadzenie do Snowflake SQL

Typowe problemy z zapytaniami

  • Eksplodujące złączenia: ostrożnie!

Nieprawidłowo

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

Wyniki zapytania, czas i liczba wierszy bez warunku ON

Wprowadzenie do Snowflake SQL

Typowe problemy z zapytaniami

  • Eksplodujące złączenia: ostrożnie!

Prawidłowo

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

Wyniki zapytania, czas i liczba wierszy z warunkiem ON

Wprowadzenie do Snowflake SQL

Typowe problemy z zapytaniami

  • UNION lub UNION ALL: poznaj różnicę
    • UNION usuwa duplikaty, spowalnia zapytanie
    • UNION ALL jest szybszy, gdy nie ma duplikatów
  • Obsługa dużych danych
    • Stosuj filtry, aby ograniczyć dane
    • Używaj limitów dla szybszych wyników
Wprowadzenie do Snowflake SQL

Jak optymalizować zapytania?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Szczegóły zapytania, czas i liczba wierszy

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Szczegóły zapytania, czas i liczba wierszy przy użyciu LIMIT 10

Wprowadzenie do Snowflake SQL

Jak optymalizować zapytania?

Użycie SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Szczegóły zapytania, czas i liczba wierszy

Unikaj SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Szczegóły zapytania, czas i liczba wierszy przy użyciu nazw kolumn

Wprowadzenie do Snowflake SQL

Jak optymalizować zapytania?

Wczesne filtrowanie

  • Stosuj klauzulę WHERE jak najwcześniej
  • Filtruj przed JOINami
    • JOIN przetworzy mniej wierszy
Wprowadzenie do Snowflake SQL

Bez wczesnego filtrowania

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
Wprowadzenie do Snowflake SQL

Z wczesnym filtrowaniem

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;
Wprowadzenie do Snowflake SQL

Historia zapytań

  • Historia zapytań
    • snowflake.account_usage.query_history
    • Historia zapytań dostarcza metryk, takich jak czas wykonania
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: dopasowywanie ciągów bez rozróżniania wielkości liter
Wprowadzenie do Snowflake SQL

Historia zapytań

  • Wykrywaj wolne lub często wykonywane zapytania
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Wyniki filtrowania dla czasu wykonania powyżej 1000 ms

Wprowadzenie do Snowflake SQL

Czas na ćwiczenia!

Wprowadzenie do Snowflake SQL

Preparing Video For Download...