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

**URL:** <https://discuss.dataengineercafe.io/t/partitions-clusters-bigquery/382>\
**Category:** BigQuery\
**Tags:** bigquery, optimization, partitioning, clustering\
**Created:** [August 24, 2022, 9:38am UTC](https://discuss.dataengineercafe.io/t/partitions-clusters-bigquery/382 "2022-08-24T09:38:03Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![zkan](https://yyz1.discourse-cdn.com/flex035/user_avatar/discuss.dataengineercafe.io/zkan/32/2_2.png) [@zkan](https://discuss.dataengineercafe.io/u/zkan)\
**Post date:** [August 24, 2022, 9:38am UTC](https://discuss.dataengineercafe.io/t/partitions-clusters-bigquery/382/1 "2022-08-24T09:38:03Z")

</div>

การทำ 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

```sql
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 ก็มีด้วยเช่นกันนะ ลองไปส่องกันดูได้

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

[![](https://canada1.discourse-cdn.com/flex035/uploads/dataengineercafe/original/1X/81fa2ae0373ecf3cb9877da5c9db830e1678dc42.jpeg "Partitioning and Clustering with BigQuery") ](https://www.youtube.com/watch?v=wapi0aR4BZE)
