Optimalizace dotazů ve Snowflake

Introduction to Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Proč optimalizovat dotazy ve Snowflake?

  • Rychlejší výsledky
  • Nižší náklady
    • Kratší doba dotazu spotřebuje méně CPU a paměti.

Obrázek znázorňující vysoké využití CPU a paměti vedoucí k nákladům

Introduction to Snowflake SQL

Běžné problémy s dotazy

  • Explodující joiny: Buďte opatrní!

Nesprávně

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

Výsledky dotazu, čas a počet řádků bez podmínky ON

Introduction to Snowflake SQL

Běžné problémy s dotazy

  • Explodující joiny: Buďte opatrní!

Správně

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

Výsledky dotazu, čas a počet řádků s podmínkou ON

Introduction to Snowflake SQL

Běžné problémy s dotazy

  • UNION nebo UNION ALL: Znáte rozdíl?
    • UNION odstraňuje duplikáty a zpomaluje dotaz
    • UNION ALL je rychlejší, pokud nejsou duplikáty
  • Práce s velkými daty
    • Filtrujte pro omezení dat
    • Používejte limity pro rychlejší výsledky
Introduction to Snowflake SQL

Jak optimalizovat dotazy?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detaily dotazu, čas a počet řádků

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Detaily dotazu, čas a počet řádků při použití LIMIT 10

Introduction to Snowflake SQL

Jak optimalizovat dotazy?

Použití SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detaily dotazu, čas a počet řádků

Vyhněte se SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detaily dotazu, čas a počet řádků při výběru názvů sloupců

Introduction to Snowflake SQL

Jak optimalizovat dotazy?

Filtrujte včas

  • Používejte klauzuli WHERE brzy
  • Filtry aplikujte před JOINy
    • JOIN zpracuje méně řádků
Introduction to Snowflake SQL

Bez včasného filtrování

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
Introduction to Snowflake SQL

Se včasným filtrováním

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;
Introduction to Snowflake SQL

Historie dotazů

  • Historie dotazů
    • snowflake.account_usage.query_history
    • Historie dotazů poskytuje různé metriky, např. dobu provádění
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: Porovnávání řetězců bez rozlišení velikosti písmen
Introduction to Snowflake SQL

Historie dotazů

  • Identifikace pomalých nebo častých dotazů
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Výsledky filtrované podle doby provádění větší než 1000 ms

Introduction to Snowflake SQL

Pojďme si procvičit!

Introduction to Snowflake SQL

Preparing Video For Download...