select distinct rs, bid, [some_other_cols ... ] from prod_table n where ee_date in ( select max(ee_date) from prod_table n1 where n1.bid = n.bid and n1.cc = n.cc and n1.rs=n.rs) --------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 571 | 51390 | 197 (4)| 00:00:03 | | 1 | HASH UNIQUE | | 571 | 51390 | 197 (4)| 00:00:03 | |* 2 | FILTER | | | | | | | 3 | HASH GROUP BY | | 571 | 51390 | 197 (4)| 00:00:03 | |* 4 | HASH JOIN | | 22250 | 1955K| 194 (3)| 00:00:03 | | 5 | TABLE ACCESS FULL| PROD_TABLE | 22250 | 738K| 96 (2)| 00:00:02 | | 6 | TABLE ACCESS FULL| PROD_TABLE | 22250 | 1216K| 97 (3)| 00:00:02 | ---------------------------------------------------------------------------------------
It contains a correlated sub-query. I rewrote it by using the analytical function rank(). I found that the consistent gets reduced by half
select distinct rs,bid, [some_other_cols ... ] from ( select n1.*, rank() over ( partition by bid, cc, rs order by ee_date desc ) rank from prod_table n1 ) where rank =1; ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 22250 | 956K| | 602 (2)| 00:00:08 | 1 | HASH UNIQUE | | 22250 | 956K| 2984K| 602 (2)| 00:00:08 |* 2 | VIEW | | 22250 | 956K| | 350 (2)| 00:00:05 |* 3 | WINDOW SORT PUSHED RANK| | 22250 | 956K| 2984K| 350 (2)| 00:00:05 | 4 | TABLE ACCESS FULL | PROD_TABLE | 22250 | 956K| | 98 (4)| 00:00:02 -------------------------------------------------------------------------------------------------
No comments:
Post a Comment