really - you have found this more efficient??? A non-equi join? (basically an anti join ultimately) for all of the rows in a table??
I found this to be "slower than", well, most things...
ps$tkyte%ORA10GR2> create table t as select * from all_objects where rownum <= 5000;
Table created.
ops$tkyte%ORA10GR2>
ops$tkyte%ORA10GR2> @trace
ops$tkyte%ORA10GR2> alter session set events '10046 trace name context forever, level 12';
Session altered.
ops$tkyte%ORA10GR2> select owner, created, object_id, object_name from (select t.*, rank() over (partition by owner order by created DESC) rn from t ) where rn = 1;
OWNER CREATED OBJECT_ID OBJECT_NAME
------------------------------ --------- ---------- ------------------------------
OUTLN 30-JUN-05 452 OL$
OUTLN 30-JUN-05 453 OL$HINTS
OUTLN 30-JUN-05 456 OL$NODES
OUTLN 30-JUN-05 457 OL$NAME
OUTLN 30-JUN-05 459 OL$HNT_NUM
OUTLN 30-JUN-05 458 OL$SIGNATURE
PUBLIC 04-AUG-06 2317 ALL_ENCRYPTED_COLUMNS
PUBLIC 04-AUG-06 2319 USER_ENCRYPTED_COLUMNS
SYS 04-AUG-06 4935 DEF$_DEFAULTDEST
SYSTEM 30-JUN-05 4902 DEF$_LOB_PRIMARY
SYSTEM 30-JUN-05 4917 DEF$_PUSHED_TRANSACTIONS
SYSTEM 30-JUN-05 4918 DEF$_PUSHED_TRAN_PRIMARY
SYSTEM 30-JUN-05 4916 DEF$_ORIGIN
SYSTEM 30-JUN-05 4903 DEF$_LOB_N1
SYSTEM 30-JUN-05 4912 DEF$_PROPAGATOR
SYSTEM 30-JUN-05 4913 DEF$_PROPAGATOR_PRIMARY
SYSTEM 30-JUN-05 4914 DEF$_PROPAGATOR_TRIG
SYSTEM 30-JUN-05 4904 DEF$_TEMP$LOB
18 rows selected.
ops$tkyte%ORA10GR2> select owner, created, object_id, object_name from t where (owner,created) in ( select owner, max(created) from t group by owner );
OWNER CREATED OBJECT_ID OBJECT_NAME
------------------------------ --------- ---------- ------------------------------
OUTLN 30-JUN-05 452 OL$
OUTLN 30-JUN-05 453 OL$HINTS
OUTLN 30-JUN-05 456 OL$NODES
OUTLN 30-JUN-05 457 OL$NAME
OUTLN 30-JUN-05 458 OL$SIGNATURE
OUTLN 30-JUN-05 459 OL$HNT_NUM
PUBLIC 04-AUG-06 2317 ALL_ENCRYPTED_COLUMNS
PUBLIC 04-AUG-06 2319 USER_ENCRYPTED_COLUMNS
SYSTEM 30-JUN-05 4902 DEF$_LOB_PRIMARY
SYSTEM 30-JUN-05 4903 DEF$_LOB_N1
SYSTEM 30-JUN-05 4904 DEF$_TEMP$LOB
SYSTEM 30-JUN-05 4912 DEF$_PROPAGATOR
SYSTEM 30-JUN-05 4913 DEF$_PROPAGATOR_PRIMARY
SYSTEM 30-JUN-05 4914 DEF$_PROPAGATOR_TRIG
SYSTEM 30-JUN-05 4916 DEF$_ORIGIN
SYSTEM 30-JUN-05 4917 DEF$_PUSHED_TRANSACTIONS
SYSTEM 30-JUN-05 4918 DEF$_PUSHED_TRAN_PRIMARY
SYS 04-AUG-06 4935 DEF$_DEFAULTDEST
18 rows selected.
ops$tkyte%ORA10GR2> select t1.owner, t1.created, t1.object_id, t1.object_name from t t1 left join t t2 on ( t1.owner = t2.owner and t2.created > t1.created) where t2.owner is null;
OWNER CREATED OBJECT_ID OBJECT_NAME
------------------------------ --------- ---------- ------------------------------
OUTLN 30-JUN-05 452 OL$
OUTLN 30-JUN-05 453 OL$HINTS
OUTLN 30-JUN-05 456 OL$NODES
OUTLN 30-JUN-05 457 OL$NAME
OUTLN 30-JUN-05 458 OL$SIGNATURE
OUTLN 30-JUN-05 459 OL$HNT_NUM
PUBLIC 04-AUG-06 2317 ALL_ENCRYPTED_COLUMNS
PUBLIC 04-AUG-06 2319 USER_ENCRYPTED_COLUMNS
SYSTEM 30-JUN-05 4902 DEF$_LOB_PRIMARY
SYSTEM 30-JUN-05 4903 DEF$_LOB_N1
SYSTEM 30-JUN-05 4904 DEF$_TEMP$LOB
SYSTEM 30-JUN-05 4912 DEF$_PROPAGATOR
SYSTEM 30-JUN-05 4913 DEF$_PROPAGATOR_PRIMARY
SYSTEM 30-JUN-05 4914 DEF$_PROPAGATOR_TRIG
SYSTEM 30-JUN-05 4916 DEF$_ORIGIN
SYSTEM 30-JUN-05 4917 DEF$_PUSHED_TRANSACTIONS
SYSTEM 30-JUN-05 4918 DEF$_PUSHED_TRAN_PRIMARY
SYS 04-AUG-06 4935 DEF$_DEFAULTDEST
18 rows selected.
select owner, created, object_id, object_name
from (select t.*, rank() over (partition by owner order by created DESC) rn from
t ) where rn = 1
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 1 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 3 0.01 0.01 0 64 0 18
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 5 0.02 0.02 0 65 0 18
Rows Row Source Operation
------- ---------------------------------------------------
18 VIEW (cr=64 pr=0 pw=0 time=10869 us)
5000 WINDOW SORT PUSHED RANK (cr=64 pr=0 pw=0 time=20852 us)
5000 TABLE ACCESS FULL T (cr=64 pr=0 pw=0 time=5058 us)
********************************************************************************
select owner, created, object_id, object_name
from t where (owner,created) in ( select owner, max(created) from t group by
owner )
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.01 0 10 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 3 0.01 0.01 0 130 0 18
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 5 0.02 0.02 0 140 0 18
Rows Row Source Operation
------- ---------------------------------------------------
18 HASH JOIN RIGHT SEMI (cr=130 pr=0 pw=0 time=7163 us)
4 VIEW VW_NSO_1 (cr=64 pr=0 pw=0 time=5916 us)
4 HASH GROUP BY (cr=64 pr=0 pw=0 time=5895 us)
5000 TABLE ACCESS FULL T (cr=64 pr=0 pw=0 time=5069 us)
5000 TABLE ACCESS FULL T (cr=66 pr=0 pw=0 time=5090 us)
********************************************************************************
select t1.owner, t1.created, t1.object_id, t1.object_name
from t t1 left join t t2 on ( t1.owner = t2.owner and t2.created > t1.created)
where t2.owner is null
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 2 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 3 2.51 2.46 0 130 0 18
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 5 2.52 2.47 0 132 0 18
Rows Row Source Operation
------- ---------------------------------------------------
18 FILTER (cr=130 pr=0 pw=0 time=395313 us)
6834641 HASH JOIN RIGHT OUTER (cr=130 pr=0 pw=0 time=6838828 us)
5000 TABLE ACCESS FULL T (cr=64 pr=0 pw=0 time=5059 us)
5000 TABLE ACCESS FULL T (cr=66 pr=0 pw=0 time=5171 us)
it would be greatly affected by the number of records created in the anti join (how many records are in each "key" - owner being my key here...). The almost cartesian product by key would get quite large.