Snowflake クエリ最適化

Snowflake SQL 入門

George Boorman

Senior Curriculum Manager, DataCamp

Snowflakeでクエリを最適化する理由は?

  • より速く結果を達成する
  • コスト効率
    • クエリ時間が短いほど、CPUやメモリなどのリソース消費が少なくなります。

CPU とメモリの高使用率がコスト増につながることを示す画像

Snowflake SQL 入門

データの問題

  • 爆発的な結合: * 注意してください!

不正解

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

クエリ結果の行と時間の詳細、ON 条件なし

Snowflake SQL 入門

データの問題

  • 爆発的な結合: * 好奇心を持つ

正しい

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

クエリ結果の行とON条件付きの時間詳細

Snowflake SQL 入門

データの問題

  • UNIONUNION ALL 違いを知る
    • UNION は重複を削除し、クエリを遅くします
    • UNION ALLは重複がない場合、より高速です
  • 欠損データの処理
    • フィルターを使用してデータ{{4}}を絞り込む
    • 制限を適用して、より迅速な結果を得る
Snowflake SQL 入門

クエリを最適化するには?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

クエリの詳細、時間と行の詳細

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

LIMIT を使用したクエリの詳細、時間と行の詳細 10

Snowflake SQL 入門

クエリを最適化するには?

SELECT * の使用 ⌛

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

クエリの詳細、時間と行の詳細

SELECT * を避ける ⚡

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

SELECT列名を使用したクエリの詳細、時間と行の詳細

Snowflake SQL 入門

クエリを最適化するには?

早期にフィルターをかける

  • WHERE句を早めに使用する
  • JOIN秒後にフィルターを適用
    • JOINは処理する行数が少なくなります
Snowflake SQL 入門

早期フィルタリングなし

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
Snowflake SQL 入門

早期フィルタリング付き

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;
Snowflake SQL 入門

クエリ履歴

  • クエリ履歴
    • snowflake.account_usage.query_history
    • クエリ履歴では、実行時間{{2}}などのさまざまなメトリックを確認できます
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

スクリーンショット 2023-09-01 14.32.29.png

  • ILIKE: 大文字・小文字を区別しない文字列一致
Snowflake SQL 入門

クエリ履歴

  • 遅い、または頻繁に実行されるクエリを特定する
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

実行時間が1000msを超える条件でのフィルタリング結果

Snowflake SQL 入門

練習しましょう!

Snowflake SQL 入門

Preparing Video For Download...