Translate

วันศุกร์ที่ 3 มีนาคม พ.ศ. 2560

SQL Performance tuning with Partition

             สวัสดีครับ สำหรับวันนี้เราจะมาเล่าถึงการ tuning sql command ให้มีประสิทธิภาพมากขึ้นโดยใช้ partitionช่วย มาดูกันเลยครับ

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 ครับ

สวัสดีครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น