การทำ partitioning กับ clustering เป็นเทคนิคที่จะช่วย optimize query ของเราให้รันเร็วขึ้น แล้วยังทำให้เราประหยัดเพิ่มมากขึ้นอีกด้วยนะ เพราะว่าเราใช้ resource ที่น้อยลง
เราสามารถใช้เทคนิคอย่างใดอย่างหนึ่ง หรือจะใช้ทั้ง 2 อย่างเลยก็ได้ แต่แนะนำว่าให้ใช้ทั้งคู่ไปเลย!
Partitions
การทำ partitioning เป็นเทคนิคในการแบ่งข้อมูลเราออกไปเป็นส่วน ๆ เช่น ถ้าเราทำ partitioning กับ column ที่ชื่อว่า date ยกตัวอย่างถ้าผมมีตารางที่ชื่อว่า user_data
และมีข้อมูลตามนี้
date | user_id | name |
---|---|---|
2021-10-05 | 5 | Zax |
2021-10-05 | 2 | Aegon |
2021-10-03 | 2 | Batman |
เราจะได้ partitioned table เป็น chunk ประมาณนี้
date | user_id |
---|---|
2021-10-03 | 2 |
และ
date | user_id |
---|---|
2021-10-05 | 5 |
2021-10-05 | 2 |
ดังนั้นเวลาที่เรารัน query
select * from user_data where date = DATE('2021-10-05')
BigQuery จะไปที่ chunk ที่ 2 และจะดึงข้อมูลเฉพาะ chunk ที่ 2 มา ซึ่งถ้าเราไม่ได้ทำ partitioning เลย สิ่งที่ BigQuery จะทำก็คือ select ข้อมูลมาทั้ง 3 แถว แล้วค่อย filter เอาเฉพาะแถวที่มี date เป็น 2021-10-05
ตรงนี้จะเห็นได้ชัดเลยว่า ถ้าเราทำ partitioning แล้ว จะช่วยลดขนาดของของข้อมูลที่เรา query ลงได้ query เราก็จะเร็วขึ้น + ประหยัดมากขึ้นด้วย เพราะใช้ resource น้อยลง
Clusters
เรื่อง clustering ใน BigQuery เนี่ย จะเป็นการบอก BigQuery ว่าให้เก็บข้อมูลที่อยู่ใน cluster เดียวกัน ไว้อยู่ใกล้ ๆ กัน และ sort ให้เราด้วย!
ยกตัวอย่างเช่น ถ้าผมมีข้อมูล user_data
ตามนี้
date | user_id | name |
---|---|---|
2021-10-05 | 5 | Zax |
2021-10-05 | 2 | Aegon |
2021-10-03 | 2 | Batman |
แล้วผมอยากจะทำ clustering กับ column ชื่อ name ผมอาจจะได้ข้อมูลเป็น chunk ตามนี้
date | user_id | name |
---|---|---|
2021-10-05 | 2 | Aegon |
2021-10-03 | 2 | Batman |
และ
date | user_id | name |
---|---|---|
2021-10-05 | 5 | Zax |
จะเห็นว่า chunk แรก เราจะได้ name ที่ใกล้ ๆ กัน เรียงกัน และอีก chunk หนึ่ง name ที่ขึ้นต้นด้วยตัว Z ก็จะถูกแยกออกมา ตรงนี้ BigQuery ทำให้เราแบบ automatically เลย มันจะหา optimal storage block ให้เราเอง
ข้อมูลที่เหมาะแก่การเอามาทำ clustering ก็อย่งเช่นพวก email พวก user ID หรือพวก category ต่าง ๆ หรือ tag เป็นต้น
Partitions + Clusters
ถ้าเราใช้ทั้งคู่เลยล่ะ? ทำ partition กับ column ชื่อ date และทำ cluster กับ column ชื่อ name กับข้อมูล user_data
นี้
date | user_id | name |
---|---|---|
2021-10-05 | 5 | Zax |
2021-10-05 | 2 | Aegon |
2021-10-03 | 2 | Batman |
เราก็อาจจะได้ chunk ประมาณนี้
date | user_id | name |
---|---|---|
2021-10-03 | 2 | Batman |
และ
date | user_id | name |
---|---|---|
2021-10-05 | 2 | Aegon |
2021-10-05 | 5 | Zax |
ในที่นี้ผลที่ได้อาจจะเหมือนกับแบบ partitioning อย่างเดียว แต่อยากให้มองว่าจริง ๆ แล้วสิ่งที่แตกต่างกันจะอยู่ที่ column ที่ชื่อ name ครับ ผลสุดท้าย BigQuery จะ sort ตามชื่อมาให้เราด้วย งดงามมาก
ดังนั้นเวลาที่เราจะจัดเก็บข้อมูล หรือ optimize ทั้งความเร็ว และเรื่อง cost ต่าง ๆ ลองดูเรื่อง partitioning กับ clustering ไว้ด้วยนะ เป็นสิ่งที่จำเป็นมาก ๆ ให้ keep in mind ไว้เลย
จริง ๆ การทำ partitioning กับ clustering ไม่ได้มีแค่ใน BigQuery เพียงอย่างเดียวนะ ตัว data warehouse ตัวอื่น อย่างเช่น Hive, Snowflake หรือ Cassandra ก็มีด้วยเช่นกันนะ ลองไปส่องกันดูได้
เผื่ออยากเห็นตัวอย่างเพิ่มเติม~ ลองดูวีดีโอนี้ประกอบนะ