Snowflake Sorgu Optimizasyonu

Snowflake SQL'e Giriş

George Boorman

Senior Curriculum Manager, DataCamp

Snowflake'te neden sorgu optimize edilir?

  • Daha hızlı sonuçlar
  • Maliyet verimliliği
    • Daha kısa sorgu süreleri CPU ve belleği daha az tüketir.

CPU ve bellek kullanımının maliyete yol açmasını gösteren görsel

Snowflake SQL'e Giriş

Yaygın sorgu sorunları

  • Patlayan JOIN'ler: Dikkat!

Yanlış

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- ON koşulu yok, patlayan JOIN'lere yol açar

ON koşulu olmadan sorgu sonucunda satır ve süre ayrıntıları

Snowflake SQL'e Giriş

Yaygın sorgu sorunları

  • Patlayan JOIN'ler: Dikkat!

Doğru

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

ON koşulu ile sorgu sonucunda satır ve süre ayrıntıları

Snowflake SQL'e Giriş

Yaygın sorgu sorunları

  • UNION veya UNION ALL: Farkı bilin
    • UNION yinelenenleri kaldırır, sorguyu yavaşlatır
    • UNION ALL yinelenme yoksa daha hızlıdır
  • Büyük veriyle çalışma
    • Veriyi daraltmak için filtre kullanın
    • Hızlı sonuç için LIMIT uygulayın
Snowflake SQL'e Giriş

Sorgular nasıl optimize edilir?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Sorgu ayrıntıları, süre ve satır bilgileri

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

LIMIT 10 kullanılarak sorgu ayrıntıları, süre ve satır bilgileri

Snowflake SQL'e Giriş

Sorgular nasıl optimize edilir?

SELECT * kullanımı ⌛

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Sorgu ayrıntıları, süre ve satır bilgileri

SELECT * kaçının ⚡

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Sütun adlarıyla sorgu ayrıntıları, süre ve satır bilgileri

Snowflake SQL'e Giriş

Sorgular nasıl optimize edilir?

Erken filtreleyin

  • WHERE koşulunu başta kullanın
  • JOIN öncesi filtre uygulayın
    • JOIN daha az satır işler
Snowflake SQL'e Giriş

Erken filtreleme olmadan

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';  -- JOIN'den sonra filtreleme
Snowflake SQL'e Giriş

Erken filtreleme ile

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- JOIN'den önce CTE'de filtreleme
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- CTE ile JOIN
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;
Snowflake SQL'e Giriş

Sorgu geçmişi

  • Sorgu Geçmişi
    • snowflake.account_usage.query_history
    • Sorgu Geçmişi, yürütme süresi gibi metrikler sağlar
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

Ekran görüntüsü 2023-09-01 14.32.29.png

  • ILIKE: Büyük/küçük harf duyarsız eşleştirme
Snowflake SQL'e Giriş

Sorgu geçmişi

  • Yavaş veya sık çalışan sorguları belirleyin
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Yürütme süresi 1000ms'den büyük olanlara göre filtreleme sonucu

Snowflake SQL'e Giriş

Hadi pratik yapalım!

Snowflake SQL'e Giriş

Preparing Video For Download...