มาทำความรู้จักกับ Partitions และ Clusters ใน BigQuery กันดีกว่า

การทำ 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 ตามชื่อมาให้เราด้วย งดงามมาก :heart:

ดังนั้นเวลาที่เราจะจัดเก็บข้อมูล หรือ optimize ทั้งความเร็ว และเรื่อง cost ต่าง ๆ ลองดูเรื่อง partitioning กับ clustering ไว้ด้วยนะ เป็นสิ่งที่จำเป็นมาก ๆ ให้ keep in mind ไว้เลย

จริง ๆ การทำ partitioning กับ clustering ไม่ได้มีแค่ใน BigQuery เพียงอย่างเดียวนะ ตัว data warehouse ตัวอื่น อย่างเช่น Hive, Snowflake หรือ Cassandra ก็มีด้วยเช่นกันนะ ลองไปส่องกันดูได้

เผื่ออยากเห็นตัวอย่างเพิ่มเติม~ ลองดูวีดีโอนี้ประกอบนะ

2 Likes