Example
ถ้า table User มีข้อมูลดังตารางด้านล่างนี้
Table USER_REGIST
id | name | surname | age | register_date |
---|---|---|---|---|
1 | Jane | Tiny | 18 | 01/02/2017 |
2 | Tom | Toy | 25 | 11/06/2015 |
3 | Jane | Toy | 20 | 12/04/2011 |
4 | Jane | Rage | 22 | 29/03/2015 |
5 | Tom | Rage | 23 | 30/12/2016 |
ถ้าต้องการ select คนชื่อ Jane ที่ register ล่าสุดเท่าที่เคยสังเกตหลายคนจะใช้คำสั่งแบบนี้
Select * from USER_REGIST where NAME = 'Jane' and REGISTER_DATE in (select max(REGISTER_DATE) from USER_REGIST where NAME = 'Jane');
ซึ่งsql command ด้านบนนี้ไม่ได้ผิดอะไรแต่เท่าที่ผมเคยเจอถ้า table นั้นๆมี data ที่เยอะมากจะ select ช้าขึ้นมากอย่างเห็นได้ชัด
วิธีการแก้ไข คือ
Select * from (
Select user.*,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY REGISTER_DATE ASC) as R from USER_REGIST user where name = 'Jane') user_table where R = 1;
ด้วย sql command ด้านบนนี้จะช่วยให้คำสั่ง select ของท่านมีประสิทธิภาพมากขึ้น partition ยังสามารถเลือกได้โดยการแบ่งตาม group name โดยที่เราไม่ต้องมานั่ง group by
ตัวอย่าง เช่น ต้องการ คนที่ชื่อ Jane คนล่าสุด และ Tom ล่าสุด
Select * from (
Select user.*,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY REGISTER_DATE ASC) as R from USER_REGIST user where name in ('Jane','Tom') ) user_table where R = 1;
จากตัวอย่างด้านบนเราเพียงแค่ where Tom เข้าไปอีกคนก็สามารถใช้ได้แล้วโดยที่ไม่ต้องมานั่งเขียนแบ่ง group แล้ว subquery มากมาย ซึ่ง partition ยังมีประโยชน์และใช้ได้อีกหลายสถานการณ์ วันนี้ยกตัวอย่างแค่พอเห็นภาพแล้วนำไปประยุคใช้เองได้ครับ เท่านี้ sql command ของเราก็สามารถมี Performance ที่ดีได้ด้วยการใช้ Partition ครับ
สวัสดีครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น