Tối ưu truy vấn Snowflake

Nhập môn Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Vì sao tối ưu truy vấn trong Snowflake?

  • Kết quả nhanh hơn
  • Tiết kiệm chi phí
    • Thời gian chạy ngắn hơn tiêu tốn ít CPU và bộ nhớ hơn.

Hình minh họa CPU và bộ nhớ cao dẫn đến tốn tiền

Nhập môn Snowflake SQL

Vấn đề truy vấn thường gặp

  • Exploding join: Cẩn trọng!

Sai

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- Thiếu điều kiện ON gây exploding join

Kết quả truy vấn: số hàng và thời gian khi không có điều kiện ON

Nhập môn Snowflake SQL

Vấn đề truy vấn thường gặp

  • Exploding join: Cẩn trọng!

Đúng

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

Kết quả truy vấn: số hàng và thời gian khi có điều kiện ON

Nhập môn Snowflake SQL

Vấn đề truy vấn thường gặp

  • UNION hoặc UNION ALL: Phân biệt rõ
    • UNION loại bỏ trùng lặp, làm chậm truy vấn
    • UNION ALL nhanh hơn nếu không có trùng
  • Xử lý dữ liệu lớn
    • Dùng bộ lọc để thu hẹp dữ liệu
    • Dùng LIMIT để có kết quả nhanh
Nhập môn Snowflake SQL

Cách tối ưu truy vấn?

SELECT * ⏳

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Chi tiết truy vấn: thời gian và số hàng

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Chi tiết truy vấn khi dùng LIMIT 10

Nhập môn Snowflake SQL

Cách tối ưu truy vấn?

Dùng SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Chi tiết truy vấn: thời gian và số hàng

Tránh SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Chi tiết truy vấn: thời gian và số hàng khi chọn tên cột

Nhập môn Snowflake SQL

Cách tối ưu truy vấn?

Lọc sớm

  • Dùng mệnh đề WHERE sớm
  • Lọc trước khi JOIN
    • JOIN sẽ xử lý ít hàng hơn
Nhập môn Snowflake SQL

Không lọc sớm

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';  -- Lọc sau JOIN
Nhập môn Snowflake SQL

Có lọc sớm

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- Lọc trong CTE trước JOIN
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- JOIN với 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;
Nhập môn Snowflake SQL

Lịch sử truy vấn

  • Lịch sử truy vấn
    • snowflake.account_usage.query_history
    • Lịch sử truy vấn cung cấp các chỉ số như thời gian thực thi
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

Ảnh chụp màn hình 2023-09-01 lúc 14.32.29.png

  • ILIKE: So khớp chuỗi không phân biệt hoa/thường
Nhập môn Snowflake SQL

Lịch sử truy vấn

  • Phát hiện truy vấn chậm hoặc chạy thường xuyên
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Lọc kết quả theo thời gian thực thi lớn hơn 1000ms

Nhập môn Snowflake SQL

¡Vamos a practicar!

Nhập môn Snowflake SQL

Preparing Video For Download...