มีข้อมูลที่ต้อง query นิดหน่อย แต่รู้สึกว่าถ้าเขียน query ธรรมดาๆ มันก็จะซับซ้อนไปนะ ก็เลยคิดว่าเอา analytic function มาใช้ดีกว่า
ยกตัวอย่างเช่น
ถ้าเราต้องการ i_prod_cd เฉพาะรายการที่มี Enddate ล่าสุด เราจะเขียน query ยังไงดี
select * from standard_cost where (i_prod_cd , enddate) in ( select i_prod_cd , max(enddate) latestdate from standard_cost group by i_prod_cd )
ซึ่งมันจะให้ query plan แบบนี้
ทีนี้เราลองมาใช้ analytic function บ้าง
select * from ( select i_prod_cd , std_cost, rank() over (partition by i_prod_cd order by enddate desc) rk from standard_cost ) x where rk = 1
พอเราเปลี่ยนวิธี query แผนการ query ก็เปลี่ยนไปด้วย
จากแผนการ query จะเห็นได้ว่าแผนการ query ต่างจากเดิมตั้งแต่กระบวนการ sort
ที่น่าสนใจคือ key ที่ใช้ sort ไม่ใช่แค่ enddate แต่เป็น i_prod_cd และ enddate ก่อนที่จะผ่านไปยัง WindowAgg
ปล. โดยรวมแล้ว actual time จะสูงขึ้นกว่าเดิม ก็พิจารณากันดีๆ นะว่าจะใช้อะไรแบบไหนดี