Order by taking less time than max() in oracle
Both execution plans are fine

select    max(id) 
from tableName a;

---------------------------------------------------------------------------------------
| Id  | Operation                  | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |          |     1 |     6 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE            |          |     1 |     6 |            |          |
|   2 |   INDEX FULL SCAN (MIN/MAX)| TAB_IDX1 |     1 |     6 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------


Here the index is accessed to get the MAX value (should require only few index block access). The SORT AGGREGATE is performed, but process only one value.

The second query ...

select id 
from (
   select id 
   from tableName 
   order by id desc) 
where rownum &lt; 2;

-----------------------------------------------------------------------------------------
| Id  | Operation                    | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |          |     1 |    13 |     3   (0)| 00:00:01 |
|*  1 |  COUNT STOPKEY               |          |       |       |            |          |
|   2 |   VIEW                       |          |     1 |    13 |     3   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN DESCENDING| TAB_IDX1 |  3000K|    17M|     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM&lt;2)


... access the index descendent and limits the number of rows to one. (again few index block access only).

Both plans are IMO comparable and my question is not why is one is slower, but why both take more than few milliseconds.

Please check the size and BLEVEL of the index. 

I suppose the ID is NUMBER. My test give for both queries on an index with 96M response &lt; 100ms.