การปรับแต่งคิวรีใน Snowflake

Snowflake SQL เบื้องต้น

George Boorman

Senior Curriculum Manager, DataCamp

ทำไมต้องปรับแต่งคิวรีใน Snowflake?

  • ได้ผลลัพธ์เร็วขึ้น
  • ประหยัดค่าใช้จ่าย
    • เวลาคิวรีที่สั้นลงใช้ทรัพยากร CPU และหน่วยความจำน้อยลง

ภาพแสดงการใช้ CPU และหน่วยความจำสูงส่งผลต่อค่าใช้จ่าย

Snowflake SQL เบื้องต้น

ปัญหาคิวรีที่พบบ่อย

  • Exploding Joins: ระวังให้ดี!

ไม่ถูกต้อง

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

ผลลัพธ์คิวรีแสดงจำนวนแถวและเวลาเมื่อไม่มีเงื่อนไข ON

Snowflake SQL เบื้องต้น

ปัญหาคิวรีที่พบบ่อย

  • Exploding Joins: ระวังให้ดี!

ถูกต้อง

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

ผลลัพธ์คิวรีแสดงจำนวนแถวและเวลาเมื่อมีเงื่อนไข ON

Snowflake SQL เบื้องต้น

ปัญหาคิวรีที่พบบ่อย

  • UNION หรือ UNION ALL: รู้จักความต่าง
    • UNION ลบข้อมูลซ้ำ ทำให้คิวรีช้าลง
    • UNION ALL เร็วกว่าเมื่อไม่มีข้อมูลซ้ำ
  • การจัดการข้อมูลขนาดใหญ่
    • ใช้ตัวกรองเพื่อจำกัดข้อมูล
    • ใช้ LIMIT เพื่อให้ได้ผลลัพธ์เร็วขึ้น
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

รายละเอียดคิวรี เวลา และจำนวนแถวเมื่อระบุชื่อคอลัมน์

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 เบื้องต้น

ประวัติคิวรี

  • Query History
    • snowflake.account_usage.query_history
    • Query History ให้ข้อมูลเมตริกต่าง ๆ เช่น เวลาในการประมวลผล
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: การจับคู่สตริงแบบไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่
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...