Im kinda curious myself why such a difference, im not a database guy, just a programmer with enough SQL knowlege to get me into trouble (and a company too tight to hire a DBA, but doesnt worry about getting a fleet of BMW's for the sales team....grrrr)
Today, the other queries do seem to be returning faster, but are still significantly slower than the new one. The plans seem a lot more expensive to me too ( using the "bigger number = bad" school of optimizing

) and of course theres still the probability that I totally missunderstood you.
Anyway, I'll try and provide as much relevant info as possible......
The 3 tables involved are -
CREATE TABLE "SEARCH_RESULTS"
( "SEARCH_ID" NUMBER(16,0), "ENTITY_ID" NUMBER(16,0), "HIGHLIGHT" NUMBER(10,0),
"WEIGHTING" NUMBER(10,0), "AVAILABILITY" NUMBER(10,0)
)
CREATE UNIQUE INDEX "PK_SEARCH_RESULTS" ON "SEARCH_RESULTS" ("SEARCH_ID", "ENTITY_ID")
- this table holds all the results of previous searches .... only really interested in the first 2 columns here tho. It contains 3.5 million rows atm, and an average SEARCH_ID might have 10-10000 entity_id rows
CREATE TABLE "PROP_PERSON_GEN"
( "BISUNIQUEID" NUMBER(16,0), "REFERENCE" NUMBER(16,0), "TITLE" NUMBER(16,0),
"FIRST_NAME" NVARCHAR2(30), "MIDDLE_NAME" NVARCHAR2(30), "LAST_NAME" NVARCHAR2(30),
"FULLNAME" NVARCHAR2(100), "SALUTATION" NVARCHAR2(30), "PERSON_ID" NUMBER(16,0)
)
CREATE UNIQUE INDEX "SYS_C0014235" ON "PROP_PERSON_GEN" ("BISUNIQUEID")
CREATE INDEX "IX_PERSON_GEN_REFERENCE" ON "CONFIGDOMAIN1"."PROP_PERSON_GEN" ("REFERENCE")
CREATE INDEX "IX_PERSON_GEN_FIRST_NAME" ON "CONFIGDOMAIN1"."PROP_PERSON_GEN" ("FIRST_NAME")
CREATE INDEX "IX_PERSON_GEN_FULLNAME" ON "CONFIGDOMAIN1"."PROP_PERSON_GEN" ("FULLNAME")
CREATE INDEX "IX_PERSON_GEN_LAST_NAME" ON "CONFIGDOMAIN1"."PROP_PERSON_GEN" ("LAST_NAME")
CREATE INDEX "IX_PERSON_GEN_PERSON_ID" ON "CONFIGDOMAIN1"."PROP_PERSON_GEN" ("PERSON_ID")
- This holds name details for people. Currently holds 440,000 rows. bisuniqueid IS SET BY A TRIGGER/SEQUENCE
CREATE TABLE "PROP_ADDRESS"
( "BISUNIQUEID" NUMBER(16,0), "OCC_ID" NUMBER(16,0), "REFERENCE" NUMBER(16,0), "STREET1" NVARCHAR2(50),
"STREET2" NVARCHAR2(30), "LOCALITY" NVARCHAR2(30), "TOWN" NVARCHAR2(30), "COUNTY" NVARCHAR2(30),
"POST_CODE" NVARCHAR2(8), "COUNTRY" NUMBER(16,0), "MAP" NVARCHAR2(100)
)
CREATE UNIQUE INDEX "SYS_C0014196" ON "CONFIGDOMAIN1"."PROP_ADDRESS" ("BISUNIQUEID")
CREATE INDEX "IX_ADDRESS_REFERENCE" ON "CONFIGDOMAIN1"."PROP_ADDRESS" ("REFERENCE")
-- This holds addresses

- currently has 500,000 rows
So thats the tables, all pretty basic.....
Here is the *actual* test query im using that works fast... page of results returned in 0.017 seconds :-
select * from ( select A.*, rownum rnum from (
SELECT "ROOT"."ENTITY_ID" AS "E01ID", PROP_PERSON_GEN.FULLNAME, PROP_ADDRESS.STREET1, PROP_ADDRESS.TOWN
FROM "SEARCH_RESULTS" "ROOT"
LEFT OUTER JOIN "PROP_PERSON_GEN" "PROP_PERSON_GEN" ON "ROOT"."ENTITY_ID"="PROP_PERSON_GEN"."REFERENCE"
LEFT OUTER JOIN PROP_ADDRESS ON "ROOT"."ENTITY_ID"="PROP_ADDRESS"."REFERENCE"
WHERE "ROOT"."SEARCH_ID"=10027
AND (PROP_ADDRESS.BISUNIQUEID is null OR PROP_ADDRESS.BISUNIQUEID =
(select min(A.BISUNIQUEID) from PROP_ADDRESS A WHERE A.REFERENCE=ROOT.ENTITY_ID))
order by E01ID
) A WHERE rownum < 20 ) WHERE rnum > 10
And the plan (CSV format - kinda new to this so am using SQLDeveloper to dump it)-
"Optimizer","Cost","Cardinality","Bytes","Partition Start","Partition Stop","Partition Id","ACCESS PREDICATES","FILTER PREDICATES"
"SELECT STATEMENT","ALL_ROWS","99","19","4028","","","","",""
"VIEW","","99","19","4028","","""RNUM"">10","","",""
"COUNT(STOPKEY)","","","","","","ROWNUM<20","","",""
"VIEW","","99","19","3781","","","","",""
"FILTER","","","","","","""PROP_ADDRESS"".""BISUNIQUEID"" IS NULL OR ""PROP_ADDRESS"".""BISUNIQUEID""= (SELECT /*+ */ MIN(""A"".""BISUNIQUEID"") FROM ""PROP_ADDRESS"" ""A"" WHERE ""A"".""REFERENCE""=:B1)","","",""
"NESTED LOOPS(OUTER)","","99","19","2508","","","","",""
"NESTED LOOPS(OUTER)","","42","19","1311","","","","",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.PK_SEARCH_RESULTS","ANALYZED","3","19","190","""ROOT"".""SEARCH_ID""=10027","","","",""
"TABLE ACCESS(BY INDEX ROWID) CONFIGDOMAIN1.PROP_PERSON_GEN","ANALYZED","3","1","59","","","","",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.IX_PERSON_GEN_REFERENCE","ANALYZED","2","1","","""ROOT"".""ENTITY_ID""=""PROP_PERSON_GEN"".""REFERENCE""(+)","","","",""
"TABLE ACCESS(BY INDEX ROWID) CONFIGDOMAIN1.PROP_ADDRESS","ANALYZED","3","1","63","","","","",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.IX_ADDRESS_REFERENCE","ANALYZED","2","1","","""ROOT"".""ENTITY_ID""=""PROP_ADDRESS"".""REFERENCE""(+)","","","",""
"SORT(AGGREGATE)","","","1","11","","","","",""
"TABLE ACCESS(BY INDEX ROWID) CONFIGDOMAIN1.PROP_ADDRESS","ANALYZED","4","1","11","","","","",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.IX_ADDRESS_REFERENCE","ANALYZED","3","1","","""A"".""REFERENCE""=:B1","","","",""
and the one without the analytic function - page of results returned in 2.82 seconds :-
select * from ( select A.*, rownum rnum from (
SELECT ROOT.ENTITY_ID AS E01ID, PROP_PERSON_GEN.FULLNAME, PROP_ADDRESS.STREET1, PROP_ADDRESS.TOWN
FROM SEARCH_RESULTS ROOT
LEFT OUTER JOIN PROP_PERSON_GEN PROP_PERSON_GEN ON ROOT.ENTITY_ID=PROP_PERSON_GEN.REFERENCE
LEFT OUTER JOIN (SELECT * from PROP_ADDRESS ADD1
WHERE BISUNIQUEID=(SELECT MAX(ADD2.BISUNIQUEID)
FROM PROP_ADDRESS ADD2 WHERE ADD1.REFERENCE=ADD2.REFERENCE)
) PROP_ADDRESS ON ROOT.ENTITY_ID=PROP_ADDRESS.REFERENCE
WHERE ROOT.SEARCH_ID=10027
order by E01ID
) A WHERE rownum < 20 ) WHERE rnum > 10
The plan :-
"Optimizer","Cost","Cardinality","Bytes","Partition Start","Partition Stop","Partition Id","ACCESS PREDICATES","FILTER PREDICATES"
"SELECT STATEMENT","ALL_ROWS","8730","19","4028","","","","",""
"VIEW","","8730","19","4028","","","","","""RNUM"">10"
"COUNT(STOPKEY)","","","","","","","","","ROWNUM<20"
"VIEW","","8730","19","3781","","","","",""
"MERGE JOIN(OUTER)","","8730","19","3021","","","","",""
"NESTED LOOPS(OUTER)","","42","19","1311","","","","",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.PK_SEARCH_RESULTS","ANALYZED","3","19","190","","","","""ROOT"".""SEARCH_ID""=10027",""
"TABLE ACCESS(BY INDEX ROWID) CONFIGDOMAIN1.PROP_PERSON_GEN","ANALYZED","3","1","59","","","","",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.IX_PERSON_GEN_REFERENCE","ANALYZED","2","1","","","","","""ROOT"".""ENTITY_ID""=""PROP_PERSON_GEN"".""REFERENCE""(+)",""
"SORT(JOIN)","","8688","1","90","","","","""ROOT"".""ENTITY_ID""=""PROP_ADDRESS"".""REFERENCE""(+)","""ROOT"".""ENTITY_ID""=""PROP_ADDRESS"".""REFERENCE""(+)"
"VIEW","","8688","1","90","","","","",""
"FILTER","","","","","","","","","""ADD1"".""BISUNIQUEID""=MAX(""ADD2"".""BISUNIQUEID"")"
"HASH(GROUP BY)","","8688","1","148","","","","",""
"HASH JOIN","","8613","501400","74207200","","","","""ADD1"".""REFERENCE""=""ADD2"".""REFERENCE""",""
"TABLE ACCESS(FULL) CONFIGDOMAIN1.PROP_ADDRESS","ANALYZED","2243","501400","5515400","","","","",""
"TABLE ACCESS(FULL) CONFIGDOMAIN1.PROP_ADDRESS","ANALYZED","2257","501400","68691800","","","","",""
and finally the query using the analytic function - page of results returned in 5.2 seconds :-
select * from ( select A.*, rownum rnum from (
SELECT "ROOT"."ENTITY_ID" AS "E01ID", PROP_PERSON_GEN.FULLNAME, PROP_ADDRESS.STREET1, PROP_ADDRESS.TOWN
FROM SEARCH_RESULTS ROOT
LEFT OUTER JOIN PROP_PERSON_GEN PROP_PERSON_GEN ON ROOT.ENTITY_ID=PROP_PERSON_GEN.REFERENCE
LEFT OUTER JOIN ( SELECT * FROM
( SELECT REFERENCE, BISUNIQUEID, STREET1, STREET2, LOCALITY, TOWN, COUNTY, POST_CODE, COUNTRY,
row_Number() over (partition by reference order by BISUNIQUEID) as rn
from PROP_ADDRESS ) WHERE rn < 2) PROP_ADDRESS
ON ROOT.ENTITY_ID=PROP_ADDRESS.REFERENCE
WHERE ROOT.SEARCH_ID=10027
order by E01ID
) A WHERE rownum < 20 ) WHERE rnum > 10
And the plan for that :-
"Optimizer","Cost","Cardinality","Bytes","Partition Start","Partition Stop","Partition Id","ACCESS PREDICATES","FILTER PREDICATES"
"SELECT STATEMENT","ALL_ROWS","30274","19","4028","","","","",""
"VIEW","","30274","19","4028","","","","","""RNUM"">10"
"COUNT(STOPKEY)","","","","","","","","","ROWNUM<20"
"VIEW","","30274","303550","60406450","","","","",""
"SORT(ORDER BY STOPKEY)","","30274","303550","52210600","","","","","ROWNUM<20"
"HASH JOIN(OUTER)","","18738","303550","52210600","","","","""ROOT"".""ENTITY_ID""=""from$_subquery$_007"".""REFERENCE""(+)",""
"HASH JOIN(OUTER)","","4894","303550","20944950","","","","""ROOT"".""ENTITY_ID""=""PROP_PERSON_GEN"".""REFERENCE""(+)",""
"INDEX(RANGE SCAN) CONFIGDOMAIN1.PK_SEARCH_RESULTS","ANALYZED","1200","303550","3035500","","","","""ROOT"".""SEARCH_ID""=10027",""
"TABLE ACCESS(FULL) CONFIGDOMAIN1.PROP_PERSON_GEN","ANALYZED","1909","430000","25370000","","","","",""
"VIEW","","9923","501400","51644200","","","","","""RN""(+)<2"
"WINDOW(SORT PUSHED RANK)","","9923","501400","31588200","","","","","ROW_NUMBER() OVER ( PARTITION BY ""REFERENCE"" ORDER BY ""BISUNIQUEID"")<2"
"TABLE ACCESS(FULL) CONFIGDOMAIN1.PROP_ADDRESS","ANALYZED","2255","501400","31588200","","","","",""
Enjoy
<< JOC >>