Optimasi Query di Snowflake

Pengantar Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Mengapa mengoptimalkan query di Snowflake?

  • Hasil lebih cepat
  • Hemat biaya
    • Waktu query lebih singkat memakai lebih sedikit CPU dan memori.

Gambar penggunaan CPU/memori tinggi yang berdampak biaya

Pengantar Snowflake SQL

Masalah umum pada query

  • Exploding join: hati-hati!

Tidak benar

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

Hasil query: jumlah baris dan waktu tanpa kondisi ON

Pengantar Snowflake SQL

Masalah umum pada query

  • Exploding join: hati-hati!

Benar

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

Hasil query: jumlah baris dan waktu dengan kondisi ON

Pengantar Snowflake SQL

Masalah umum pada query

  • UNION atau UNION ALL: pahami bedanya
    • UNION menghapus duplikat, memperlambat query
    • UNION ALL lebih cepat jika tidak ada duplikat
  • Menangani data besar
    • Gunakan filter untuk mempersempit data
    • Terapkan limit untuk hasil lebih cepat
Pengantar Snowflake SQL

Bagaimana mengoptimalkan query?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detail query: waktu dan jumlah baris

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Detail query: waktu dan baris dengan LIMIT 10

Pengantar Snowflake SQL

Bagaimana mengoptimalkan query?

Menggunakan SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detail query: waktu dan jumlah baris

Hindari SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detail query: waktu dan baris saat memilih nama kolom

Pengantar Snowflake SQL

Bagaimana mengoptimalkan query?

Filter Lebih Awal

  • Gunakan klausa WHERE sejak awal
  • Terapkan filter sebelum JOIN
    • JOIN memproses lebih sedikit baris
Pengantar Snowflake SQL

Tanpa penyaringan awal

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
Pengantar Snowflake SQL

Dengan penyaringan awal

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;
Pengantar Snowflake SQL

Riwayat query

  • Riwayat Query
    • snowflake.account_usage.query_history
    • Menyediakan metrik seperti waktu eksekusi
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

Tangkapan layar 2023-09-01 pukul 14.32.29

  • ILIKE: pencocokan string tidak peka huruf besar/kecil
Pengantar Snowflake SQL

Riwayat query

  • Temukan query yang lambat atau sering berjalan
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Penyaringan hasil dengan execution_time > 1000ms

Pengantar Snowflake SQL

Ayo berlatih!

Pengantar Snowflake SQL

Preparing Video For Download...